zoukankan      html  css  js  c++  java
  • .Net拾忆:从List去除重复-拾忆集合

    方法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()方法进行比较, 根据比较结果使用二叉树形式进行存储
    */

  • 相关阅读:
    random模块的随机变换
    re模块与正则表达式进阶
    面向对象整体细化
    __new__内部工作方式
    前端之CSS
    前端之HTML
    数据库
    同步异步阻塞非阻塞
    进程间的通信
    day 36(多进程)
  • 原文地址:https://www.cnblogs.com/xmai/p/7112219.html
Copyright © 2011-2022 走看看