1. 程式人生 > >從List去除重復拾憶集合

從List去除重復拾憶集合

但是 去重 集合 cnblogs hash 對象 () 二叉 clas

方法1:

private static List<int> DistinctList(List<int> list)
        {//去除重復
            HashSet<int> ha = new HashSet<int>(list);
            list.Clear();
            list.AddRange(ha);
            return list;
        }

原理:HashSet每次存入會計算哈希值,哈希值相同則比較對方是否相同,不同則直接存入

方法2:

private
static List<int> DistinctList2(List<int> list) { return list.Distinct().ToList(); }

原理:Enumerable中Distinct官方實現

static IEnumerable<TSource> DistinctIterator<TSource>(IEnumerable<TSource> source, IEqualityComparer<TSource> comparer) {
            Set
<TSource> set = new Set<TSource>(comparer); foreach (TSource element in source) if (set.Add(element)) yield return element; }

拾憶

1.HashSet
只去重復, 沒有順序
HashSet的add方法會調用hashCode和equals, 所以存儲在HashSet中的對象需要重寫這兩個方法.

2.TreeSet
去重復, 並且可以按照某種順序排序
TreeSet的add方法會將對象轉為Comparable, 然後調用compareTo方法, 所以存儲在TreeSet中的對象必須實現Comparable, 重寫compareTo方法

HashSet原理:

/*
* 如果我們希望一個集合有去重復的功能, 可以在它的add方法中檢查要添加的對象在集合中是否存在.
* 叠代集合中每個元素, 和要添加的比較, 如果相同, 就不存.
*
* 如果使用上述方法, 當集合元素特別多的時候, 效率會很低.
*例如: 集合中有1萬個元素, 當存儲下一個的時候, 需要和前面1萬個都比較, 效率較低.
*
* HashSet的工作原理:
* 每次存儲對象的時候, 調用對象的hashCode()方法, 計算一個哈希值. 在集合中查找是否包含哈希值相同的元素.
* 如果沒有哈希值相同元素, 直接存入.
* 如果有哈希值相同的元素, 逐個使用equals()方法比較.
* 比較結果全為false就存入.
* 如果比較結果有true則不存.
*
* 如何將自定義類對象存入HashSet進行去重復
* 類中必須重寫hashCode()方法和equals()方法
* equals()方法中比較所有屬性
* hashCode()方法要保證屬性相同的對象返回值相同, 屬性不同的對象盡量不同

TreeSet原理:


/*
* TreeSet存儲對象的時候, 可以排序, 但是需要指定排序的算法
*
* Integer能排序(有默認順序), String能排序(有默認順序), 自定義的類存儲的時候出現異常(沒有順序)
*
* 如果想把自定義類的對象存入TreeSet進行排序, 那麽必須實現Comparable接口
* 在類上implement Comparable
* 重寫compareTo()方法
* 在方法內定義比較算法, 根據大小關系, 返回正數負數或零
* 在使用TreeSet存儲對象的時候, add()方法內部就會自動調用compareTo()方法進行比較, 根據比較結果使用二叉樹形式進行存儲
*/

從List去除重復拾憶集合