Frage: Ich habe zum Beispiel ein Array (die Anzahl der Elemente ist 0) und ich hoffe, dass die hinzugefügten Elemente nicht wiederholt werden können.
Wenn ich eine solche Frage bekomme, schreibe ich vielleicht schnell den Code auf. Das Array hier verwendet ArrayList.
private static void testListSet(){ List<String> arrays = new ArrayList<String>(){ @Override public boolean add(String e) { for(String str:this){ if(str.equals(e)){ System.out.println("add failed !!! duplicate element"); return false; }else{ System.out.println("add successed !!!"); } } return super.add(e); } }; arrays.add("a");arrays.add("b");arrays.add("c");arrays.add("b"); for(String e:arrays) System.out.print(e); }
Mir ist hier alles egal, es interessiert mich nur Informationen zum Hinzufügen von Elementen zum Array (natürlich nur zum Hinzufügen von Array-Elementen verwenden), ob dasselbe Element bereits vorhanden ist. Wenn das Element nicht im Array vorhanden ist, wird es dem Array hinzugefügt und umgekehrt. Es mag einfach sein, so zu schreiben, aber angesichts eines riesigen Arrays wirkt es umständlich: Wenn es ein Element in einem Array mit 100.000 Elementen gibt, müssen wir dann 100.000 Mal gleich aufrufen? Hier sind die Grundlagen.
Frage: Wie lösche ich die doppelten Elemente im Array, nachdem ich ein Array hinzugefügt habe, das bereits einige Elemente enthält?
Wie wir alle wissen, können Sammlungen in Java in zwei Kategorien unterteilt werden: Liste und Menge. Die Elemente in der Sammlung der List-Klasse müssen geordnet sein, können aber wiederholt werden, während die Elemente in der Sammlung der Set-Klasse ungeordnet sein müssen, aber nicht wiederholt werden können. Dann können Sie hier überlegen, ob die Verwendung der Set-Funktion zum Löschen doppelter Elemente das Ziel erreicht. Schließlich ist die Verwendung des vorhandenen Algorithmus im System besser als der Algorithmus, den Sie jetzt schreiben.
public static void removeDuplicate(List<People> list){ HashSet<People> set = new HashSet<People>(list); list.clear(); list.addAll(set); } ivate static People[] ObjData = new People[]{ new People(0, "a"),new People(1, "b"),new People(0, "a"),new People(2, "a"),new People(3, "c"), };
public class People{ private int id; private String name; public People(int id,String name){ this.id = id; this.name = name; } @Override public String toString() { return ("id = "+id+" , name "+name); } }
Der obige Code verwendet eine benutzerdefinierte People-Klasse. Wenn ich dasselbe Objekt hinzufüge (das sich auf denselben Dateninhalt bezieht), rufe ich die Methode „removeDuplicate“ auf und stelle fest, dass dies das eigentliche Problem nicht löst. das gleiche Objekt existiert noch. Wie kann man also feststellen, ob Objekte in HashSet gleich sind? Öffnen Sie den HashSet-Quellcode und Sie werden feststellen, dass Sie jedes Mal, wenn Sie Daten hinzufügen, die Add-Methode aufrufen müssen:
@Override public boolean add(E object) { return backingMap.put(object, this) == null; }
Die BackingMap hier sind die von HashSet verwalteten Daten. Es verwendet eine sehr clevere Methode Behandeln Sie das jedes Mal hinzugefügte Objekt als SCHLÜSSEL in der HashMap und das HashSet-Objekt selbst als WERT. Dies nutzt die KEY-Eigenschaft in Hashmap aus und natürlich werden die Daten von HashSet nicht wiederholt. Ob es jedoch tatsächlich doppelte Daten gibt, hängt davon ab, wie festgestellt werden kann, ob zwei SCHLÜSSEL in HashMap gleich sind.
@Override public V put(K key, V value) { 390 if (key == null) { 391 return putValueForNullKey(value); 392 } 393 394 int hash = secondaryHash(key.hashCode()); 395 HashMapEntry<K, V>[] tab = table; 396 int index = hash & (tab.length - 1); 397 for (HashMapEntry<K, V> e = tab[index]; e != null; e = e.next) { 398 if (e.hash == hash && key.equals(e.key)) { 399 preModify(e); 400 V oldValue = e.value; 401 e.value = value; 402 return oldValue; 403 } 404 } 405 406 // No entry for (non-null) key is present; create one 407 modCount++; 408 if (size++ > threshold) { 409 tab = doubleCapacity(); 410 index = hash & (tab.length - 1); 411 } 412 addNewEntry(key, value, hash, index); 413 return null; 414 }
Im Allgemeinen besteht die Idee hier darin, die Elemente in der Hashmap zu durchlaufen. Wenn die Hashcodes der Elemente gleich sind (tatsächlich müssen die Hashcodes einmal verarbeitet werden), dann beurteilen Sie die eqaul-Methode von SCHLÜSSEL. Wenn diese beiden Bedingungen erfüllt sind, handelt es sich um unterschiedliche Elemente. Wenn der Elementtyp im Array hier angepasst wird und Sie den Set-Mechanismus verwenden möchten, müssen Sie die Methode equal und hashmap selbst implementieren (der Hashmap-Algorithmus wird hier nicht im Detail vorgestellt, ich kann ihn nur verstehen) Methode: #🎜 🎜#
public class People{ private int id; // private String name; public People(int id,String name){ this.id = id; this.name = name; } @Override public String toString() { return ("id = "+id+" , name "+name); } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public boolean equals(Object obj) { if(!(obj instanceof People)) return false; People o = (People)obj; if(id == o.getId()&&name.equals(o.getName())) return true; else return false; } @Override public int hashCode() { // TODO Auto-generated method stub return id; //return super.hashCode(); } }
Das obige ist der detaillierte Inhalt vonSo entfernen Sie doppelte Elemente aus einem Array in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!