2017-06-08 4 views
0

Ich habe zwei List<Object[]> und ich muss die Werte darin vergleichen und eine endgültige Liste mit nur eindeutigen Werten erstellen.Vergleichen Sie zwei Liste <Object[]> effizient in Java

Ex:

List<Object[]> list1 has n rows of object list with 5 columns 
    [[val1,val2,val3,val4,val5],[val1_,val2_,val3_,val4_,val5_]] 

List<Object[]> list2 has n rows of Object list with 4 columns 
    [[val3_,val4_,val5_,val6_],[val2,val3,val4,val5]] 

Die Zusammensetzung der zweiten bis fünften Spalte von Elementen in Object Array in der list1 könnte im list2 mit den Elementen in Object Array entsprechen. Wenn alle diese Spalten übereinstimmen, sollte das in der neuen List nicht wiederholt werden. Oder, anstatt eine neue Liste zu verwenden, kann ich einfach den Inhalt in list1 selbst aktualisieren. Wenn list2 etwas Einzigartiges hat, das list1 nicht hat, werde ich es der Liste hinzufügen. Leider wird die Ausgabe meines Programms nur List<Object[]> ergeben. Kann mir bitte jemand sagen, wie ich diesen Vergleich effizient machen kann?

+0

Was haben Sie bisher geschrieben? Sie sagen auch 'n' Zeilen, aber was ist die höchste Anzahl von' n'? Sie können sich voroptimieren ... Machen Sie sich einen Vergleich und machen Sie einen Benchmark, dann sehen Sie, wo Sie sich verbessern müssen, wenn Sie es brauchen. –

+1

Willst du sagen, dass du eine einzigartige Werteunion willst? Wenn das der Fall ist, können Sie sie vielleicht einfach zu einem HashSet hinzufügen und dann eine ArrayList mit dem HashSet erstellen. Dies würde Ihnen eine eindeutige Menge von Werten geben (wenn ich die Frage verstehe). Was sind die Objekte? – markg

+1

@markg, HashSet wird nicht funktionieren, da Java-Arrays keine Gleichheit implementieren. –

Antwort

0

Arrays haben keine equals oder hashcode Methode, aber List s tun, so können Sie eine List als Schlüssel zu einem HashMap verwenden.

eine Methode schreiben List<Object> zu erzeugen, als Schlüssel zu verwenden:

  • für Ihre 5-Elemente-Liste, wird es new ArrayList(array).subList(1,array.length)
  • für Ihre 4-Element-Liste sein, wird es new ArrayList(array) sein

Dann:

Map map = new HashMap<List<Object>, Object[]>(); 
for(array : fourColumnArrays) { 
    map.put(keyForFourElements(array), array); 
} 
for(array : fiveColumnArrays) { 
    map.put(keyForFiveColumnArrays(array), array); 
} 

map enthält jetzt die benötigten Arrays.

Verwandte Themen