list對象去重

轉載請標明出處,維權必究:http://www.javashuo.com/article/p-kichugqe-ev.html html

咋們來看看。首先定義一個對象,隨便吧算法

public class Data{
        public String s;
    }

而後有好多的Data對象放在list數組中,而咱們要根據Data對象裏面的s來判斷list中是否有相同的對象,若是用for循環一個個來比較,那麼當裏邊的對象越多,那麼比較的次數也會愈來愈多,這不是好作法,那應該怎麼比較呢?數組

這就要利用HashSet的性質,不可重複。ide

 

HashSet如何實現去重:this

是經過調用元素內部的hashCode和equals方法實現去重,首先調用hashCode方法,比較兩個元素的哈希值,若是哈希值不一樣,直接
認爲是兩個對象,中止比較。若是哈希值相同,再去調用equals方法,返回true,認爲是一個對象。返回false,認爲是兩個對象。

spa

HashSet查找的高效性:code

Hash算法對每個對象都計算出一個Hash碼,根據Hash碼把對象分配到某個存儲區域中,好比一個集合包含了不少人,根據國籍,中國人是一個存儲區域,美國人是一個存儲區域,英國人是一個存儲區域,......。這樣若是要查找該集合是否包含了某個中國人,就到中國人的存儲區域去比較就好了,這樣大大提升了效率。htm

Java中實現了Hash的集合是HashSet。HashSet查找某個對象時,首先用hashCode()方法計算出這個對象的Hash碼,而後再根據Hash碼到相應的存儲區域用equals()方法查找。對象

 

因而可知利用HashSet去重是可行的。blog

一、重寫比較對象Data的的HashCode與equal方法。

 @Override
    public int hashCode() {
        if (null == s)
            return super.hashCode();
        else {
//相同String的HashCode是同樣的,因此若當以前已經有了一個對象,而且s
//與將要加入的對象的s同樣,那麼因爲兩個對象有相同HashCode,
//那麼他們就會去執行equal方法進行比較,如果同樣,後面的對象加入失敗
return s.hashCode(); } } @Override public boolean equals(Object obj) { if (null == obj) return false; if (obj == this) return true; if (!(obj instanceof Data)) return false; Data data = (Data) obj; if (data.s.equals(s)) return true; return false; }

二、比較:

List list = new ArrayList<Data>();
for(int i = 0;i<10;i++) {
   Data data = new Date();
   data.s = "" + i;
   list.add(data);
        }

 

HashSet h = new HashSet(list);
list.clear();
list.addAll(h);

HashSet h = new HashSet(list);這一步會將重複的元素去掉,固然,不是隨機去掉,而是list中排在後面的與前面相同的去掉。由於是一個個加入HashSet裏面的,固然最終獲得的結果是無序的,若是須要按照原來的順序還須要進行排序處理
相關文章
相關標籤/搜索