首頁 > Java > java教程 > Java如何刪除陣列中的重複元素

Java如何刪除陣列中的重複元素

王林
發布: 2023-05-01 10:28:06
轉載
1210 人瀏覽過

問題:例如我有一個陣列(元素個數為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方法),是否已存在相同元素,如果數組中不存在這個元素,就添加到這個數組中,反之亦然。這樣寫可能簡單,但是面臨龐大數組時就顯得笨拙:有100000元素的數組天家一個元素,難道要調用100000次equal嗎?這裡是個基礎。

問題:加入已經有一些元素的陣列了,要怎麼刪除這個陣列裡重複的元素呢?

大家知道java中集合總的可以分成兩大類:List與Set。 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維護的數據,它用了一個很巧妙的方法,把每次加入的Object當作HashMap裡面的KEY,本身HashSet物件當作VALUE。這樣就利用了Hashmap裡的KEY***性,自然的HashSet的資料不會重複。但真正的是否有重複數據,就得看HashMap裡的怎麼判斷兩個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     }
登入後複製

總的來說,這裡實現的想法是:遍歷hashmap裡的元素,如果元素的hashcode相等(事實上還要對hashcode做一次處理),然後去判斷KEY的eqaul方法。如果這兩個條件滿足,那就是不同元素。那這裡如果陣列裡的元素型別是自訂的話,要利用Set的機制,那就得自己實作equal與hashmap(這裡hashmap演算法就不詳細介紹了,我也就理解一點)方法了:

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();      }  }
登入後複製

以上是Java如何刪除陣列中的重複元素的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板