Heim >Java >javaLernprogramm >So entfernen Sie doppelte Elemente aus einem Array in Java

So entfernen Sie doppelte Elemente aus einem Array in Java

王林
王林nach vorne
2023-05-01 10:28:061210Durchsuche

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen