2016-07-19 14 views
0

Sagen wir, ich habe 3 Matrizen von Schülern, [A, B, C], die untereinander nicht eindeutig sind (d. H. Das A-Feld könnte einen Schüler haben, der auch in Feld B zu finden ist). Ich suche nach einer effizienten Möglichkeit, diese Arrays so zu filtern, dass jedes von A, dann B und dann C eindeutig ist (dh der Schüler in den Arrays A und B erscheint am Ende in der A-Liste und wird aus der B-Liste entfernt) da A vor B ist). Wie kann ich dies tun, während die Array-Arrays A, B und C getrennt bleiben? (d. h. ich kann nicht einfach alle Schüler in ein Set werfen, weil sie dann ihre Assoziation mit der Liste verlieren, zu der sie ursprünglich gehören).Setzt den Sortieralgorithmus

Das Schülerobjekt hat eine ID-Eigenschaft, die zum Sortieren/Filtern verwendet werden kann. Das Spielzeug Problem für 3 Listen ist nur (es kann auf größere Listen erweitern, so dass Deshalb habe ich für eine optimale Lösung suchen)

A [1, 2, 3, 4] 
B [5, 6, 1, 9] 
C [3, 7, 5, 8] 

Results 
A [1, 2, 3, 4] 
B [5, 6, 9] ->original order is preserved (i.e. 5 is before 6 which is before 9) 
C [7, 8] 
+2

etwas wie 'B.removeAll (A)'? (Und wenn Sie größere Datenmengen haben, ist bekannt = new Set(); bekannt.addAll (A); B.removeAll (bekannt); bekannt.addAll (B); C.removeAll ... ') – njzk2

Antwort

1

Alles was Sie tun müssen, ist ein HashSet zu schaffen, die alle eindeutigen Werte hält .

  • Dann beginnend mit Array/Liste A, fügen Sie jedes Element zum Satz hinzu.
    • Wenn der Wert hinzugefügt wird, wechseln Sie zum nächsten Wert.
    • Wenn es abgelehnt wird (gibt false zurück) entfernen Sie das Element aus dem Array und verschieben Sie dann auf die nächste Nummer.
  • Wenn das Ende des Arrays/Liste erreicht ist, gehen Sie zur nächsten Liste.

Am Ende sollten Sie alle eindeutigen Listen ohne Wiederholung von Zahlen zwischen ihnen haben.

0

Da a, b, c Listen der Studenten sind, und dass die Schüler-Klasse implementiert equals() (und hashCode()) richtig, können Sie die Schüler entfernen, die von den nachfolgenden Listen in früheren Listen erscheinen:

b.removeAll(a); 
c.removeAll(a); 
c.removeAll(b); 

Die Reihenfolge der Studenten das bleibt in der Liste bleibt natürlich erhalten.