質問: たとえば、配列 (要素の数が 0) があり、追加された要素が繰り返されないことを望みます。
そのような質問を受けたとき、私はすぐにコードを書き留めることがあります。ここでの配列は 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); }
ここでは何も気にせず、何をするかだけが気になります配列に要素を追加するときは、同じ要素が既に存在するかどうかを確認します (もちろん、配列要素を追加するには add メソッドのみを使用します)。要素が配列に存在しない場合は、その要素を配列に追加します。逆も同様です。このように書くのは簡単かもしれませんが、巨大な配列に直面するとぎこちないように思えます。100,000 個の要素を持つ配列に 1 つの要素がある場合、equal を 100,000 回呼び出す必要があるでしょうか。基本は次のとおりです。
質問: すでにいくつかの要素を含む配列を追加した後、配列内の重複した要素を削除するにはどうすればよいですか?
Java のコレクションは一般に、List と Set の 2 つのカテゴリに分類できることは誰もが知っています。 List クラスのコレクション内の要素は順序付けされている必要がありますが、繰り返すことができますが、Set クラスのコレクション内の要素は順序付けされていない必要がありますが、繰り返すことはできません。次に、Set 機能を使用して重複要素を削除することで目的が達成されるかどうかを検討します。結局のところ、システム内の既存のアルゴリズムを使用する方が、今作成するアルゴリズムよりも優れています。
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); } }
上記のコードはカスタム People クラスを使用しています。同じオブジェクトを追加するとき (同じデータ コンテンツを参照する)、removeDuplicate メソッドを呼び出しますが、これでは実際の問題は解決されません。オブジェクトが存在します。では、HashSet 内のオブジェクトが同じかどうかをどのように判断するのでしょうか? HashSet ソース コードを開くと、データを追加するたびに add メソッドを呼び出す必要があることがわかります:
@Override public boolean add(E object) { return backingMap.put(object, this) == null; }
ここでの backingMap は HashSet によって維持されるデータです。これは非常に賢いメソッドを使用して追加します。今回追加したそれぞれのオブジェクトをHashMap内のKEYとし、HashSetオブジェクト自体をVALUEとします。これはHashmapのKEYプロパティを利用するもので、当然HashSetのデータは重複しません。ただし、実際に重複データが存在するかどうかは、HashMap で 2 つの KEY が同じかどうかを判断する方法によって決まります。
@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 }
一般に、ここでの考え方は、ハッシュマップ内の要素を走査することです。要素のハッシュコードが等しい場合 (実際には、ハッシュコードは 1 回処理する必要があります)、KEY の eqaul メソッドを判断します。 。これら 2 つの条件が満たされる場合、それらは異なる要素になります。配列内の要素の型がカスタマイズされており、Set メカニズムを使用したい場合は、equal と hashmap を自分で実装する必要があります (ハッシュマップ アルゴリズムについてはここでは詳しく紹介しません。理解することしかできません)。メソッド:
リーリー以上がJavaで配列から重複要素を削除する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。