這篇文章主要介紹了Java實現數組去除重複資料的方法,結合實例形式詳細分析了java數組去除重複的幾種常用方法、實現原理與相關注意事項,需要的朋友可以參考下
本文實例講述了Java實作陣列去除重複資料的方法。分享給大家供大家參考,具體如下:
前一段時間被面試問到:如果一個陣列中有重複元素,用什麼方法可以去重?一時間會想到用一種方法,但是後來查閱資料後發現,有好多方法可以實現,現在就總結一下,比較簡單的幾種。
一.用List集合實作
int[] str = {5, 6, 6, 6, 8, 8, 7,4}; List<Integer> list = new ArrayList<Integer>(); for (int i=0; i<str.length; i++) { if(!list.contains(str[i])) { list.add(str[i]); } } System.out.println("去除重复后的list集合"+list);
輸出結果是:
去除重复后的list集合[5, 6, 8, 7, 4]
可以看到可以移除重複的元素,但是沒有實作排序功能。
二.用hashSet或TreeSet實作
Integer[] nums = { 5, 5, 6, 6, 6, 8, 8, 7, 11, 12, 12 }; // HashSet hset = new HashSet(Arrays.asList(nums)); TreeSet<Integer> hset = new TreeSet<Integer>(Arrays.asList(nums)); Iterator i = hset.iterator(); while(i.hasNext()){ System.out.println(i.next()); }
輸出結果:
5 6 7 8 11 12
可以看到不僅去除了重複數據,而且將數據進行了排序。
其中Arrays.asList()
是將一個陣列轉換為一個List對象,這個方法會傳回一個ArrayList類型的對象, 這個ArrayList類別並非java.util.ArrayList類,而是Arrays類別的靜態內部類別!
TreeSet不僅可以使元素不重複,而且可以實現排序等功能的集合,它在物件元素添加到集合中時會自動按照某種比較規則將其插入到有序的物件序列中。
三.用List與set實作
int[] nums = { 5, 6, 6, 6, 8, 8, 7 }; List<Integer> numList = new ArrayList<Integer>(); for (int i : nums) numList.add(i); Set<Integer> numSet = new HashSet<Integer>(); numSet.addAll(numList); System.out.println(numSet);
輸出結果:
[5, 6, 7, 8]
可以看出,也是去掉重複的數據,並且實現了排序。
我們來做一個HashSet與TreeSet的比較:
HashSet
HashSet有以下特點
1) 不能保證元素的排列順序,順序有可能改變
2) 不是同步的
3) 集合元素可以是null,但只能放入一個null
當存入一個元素到HashSet集合中時,HashSet會呼叫該物件的hashCode()方法來得到該物件的hashCode值,然後根據hashCode值來決定該物件在HashSet中儲存位置。
簡單的說,HashSet集合判斷兩個元素相等的標準是兩個物件透過equals方法比較相等,並且兩個物件的hashCode()方法傳回值相等
注意,如果要把一個物件放入HashSet中,重寫該物件對應類別的equals方法,也應該重寫其hashCode()方法。其規則是如果兩個對 象透過equals方法比較傳回true時,其hashCode也應該相同。另外,在物件中用作equals比較標準的屬性,都應該用來計算 hashCode的值。
TreeSet類別
TreeSet是SortedSet介面的唯一實作類,TreeSet可以確保集合元素處於排序狀態。 TreeSet支援兩種排序方式,自然排序 和自訂排序,其中自然排序為預設的排序方式。在TreeSet中加入的應該是同一個類別的物件。
TreeSet判斷兩個物件不相等的方式是兩個物件透過equals方法傳回false,或透過CompareTo方法比較沒有回傳0
自然排序
自然排序使用要排序元素的CompareTo(Object obj)方法來比較元素之間大小關係,然後將元素依照升序排列。
Java提供了一個Comparable接口,該接口裡定義了一個compareTo(Object obj)方法,該方法返回一個整數值,實現了該接口的對象就可以比較大小。
obj1.compareTo(obj2)方法如果傳回0,則表示被比較的兩個物件相等,如果傳回一個正數,則表示obj1大於obj2,如果是 負數,則表示obj1小於obj2。 如果我們將兩個物件的equals方法總是傳回true,則這兩個物件的compareTo方法傳回應該會傳回0自訂排序
##### ##自然排序是根據集合元素的大小,以升序排列,如果要自訂排序,應該使用Comparator接口,實作int compare(T o1,T o2)方法。 #########最重要:#########1、TreeSet 是二差樹實現的,Treeset中的資料是自動排好序的,不允許放入null值。 ######2、HashSet 是哈希表實現的,HashSet中的資料是無序的,可以放入null,但只能放入一個null,兩者中的值都不能重複,就如資料庫中唯一約束。 ######3、HashSet要求放入的對象必須實作HashCode()方法,放入的對象,是以hashcode碼作為標識的,而具有相同內容的String對象,hashcode是一樣,所以放入的內容不能重複。但是同一個類別的物件可以放入不同的實例 。 ###以上是Java數組去除重複資料的實作方法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!