天天看點

list對象去重

轉載請标明出處,維權必究:https://www.cnblogs.com/tangZH/p/10334267.html 

更多檢視:http://77blogs.com/?p=471

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

public class Data{
        public String s;
    }      

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

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

HashSet如何實作去重:

是通過調用元素内部的hashCode和equals方法實作去重,首先調用hashCode方法,比較兩個元素的哈希值,如果哈希值不同,直接

認為是兩個對象,停止比較。如果哈希值相同,再去調用equals方法,傳回true,認為是一個對象。傳回false,認為是兩個對象。

HashSet查找的高效性:

Hash算法對每一個對象都計算出一個Hash碼,根據Hash碼把對象配置設定到某個存儲區域中,比如一個集合包含了很多人,根據國籍,中國人是一個存儲區域,美國人是一個存儲區域,英國人是一個存儲區域,......。這樣如果要查找該集合是否包含了某個中國人,就到中國人的存儲區域去比較就行了,這樣大大提高了效率。

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

由此可見利用HashSet去重是可行的。

1、重寫比較對象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;
    }      

2、比較:

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裡面的,當然最終得到的結果是無序的,如果需要按照原來的順序還需要進行排序處理