Javaで配列から重複要素を削除する方法

王林
リリース: 2023-05-01 10:28:06
転載
1179 人が閲覧しました

質問: たとえば、配列 (要素の数が 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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!