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

时间: 2024-08-11 03:36:16

从List去除重复拾忆集合的相关文章

List集合去除重复元素,不打乱顺序(数组转List)

//数组转List List<String> objStr_0_List = Arrays.asList(objArr[0].split("#,#")); //List集合去除重复元素,不打乱顺序 private List<String> getNon_repeatList(List<String> Str_List) { List<String> resultList = new ArrayList<String>(); S

去除List集合中的重复元素? 如果没有Set集合,List集合是怎么去除重复元素的(字符串类型,自定义类型)?

 关键字: 如果没有Set集合,List集合是怎么去除重复元素的(字符串类型)?  *   *     思考: List就可以存储重复元素,那么需求中容器中的元素必须保证唯一性,该如何解决呢??  *      *   去除List集合中的重复元素?  * * 思路: * * 1.首先我需要另一个临时容器tempList,用来存放我认为应该保留的元素.(也就是不重复的元素) * 2.然后我们应该遍历原容器, 一个一个的取出元素, 放入tempList. * 当tempList里已经装有刚刚取出的

java集合 collection-list-ArrayList 将自定义对象作为元素存到ArrayList集合中,并去除重复元素。

import java.util.*; /* 将自定义对象作为元素存到ArrayList集合中,并去除重复元素. 比如:存人对象.同姓名同年龄,视为同一个人.为重复元素. 思路: 1,对人描述,将数据封装进人对象. 2,定义容器,将人存入. 3,取出. List集合判断元素是否相同,依据是元素的equals方法. */ class Person { private String name; private int age; Person(String name,int age) { this.n

list集合去除重复对象的实现

下面小编就为大家带来一篇list集合去除重复对象的实现.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 对象重复是指对象里面的变量的值都相等,并不定是地址.list集合存储的类型是基础类型还比较好办,直接把list集合转换成set集合就会自动去除. 当set集合存储的是对象类型时,需要在对象的实体类里面重写public boolean equals(Object obj) {} 和 public int hashCode() {} 两个方法. public Stri

List集合去除重复数据

[转自]Java中List集合去除重复数据的方法 1. 循环list中的所有元素然后删除重复 public static List removeDuplicate(List list) { for ( int i = 0 ; i < list.size() - 1 ; i ++ ) { for ( int j = list.size() - 1 ; j > i; j -- ) { if (list.get(j).equals(list.get(i))) { list.remove(j); }

EF+Lamdba的三种去除重复项

今天在写项目的时候出现了这个问题,经过百度和帮人帮助最终原来lamdba是这样去除重复项的             var Total1 = db.NikeDTCDailyReport.Where(p => p.CN_Launch_Date >= date1 && p.CN_Launch_Date <= date2).Where(p => p.CN_Planning_Qty != 0).ToList();             var Total2= Total1

Python 迭代删除重复项,集合删除重复项

1. 迭代删除重复项:先排序列表项,然后通过新迭代(not in)去除重复项,分片打印 def sanitize(time_string): if '-' in time_string: splitter = '-' elif ':' in time_string: splitter = ':' else: return (time_string) (mins, secs)=time_string.split(splitter) return(mins + '.' + secs) with op

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); 输出结果是

TreeSet中不能去除重复元素。。。。。。。。。。。。。。

import java.util.Comparator;import java.util.Set;import java.util.TreeSet; /** * TreeSet如果是存String,默认会按照字母排序 * */public class Demo01 { public static void main(String[] args) { // TODO Auto-generated method stub //在一个集合中存储了无序并且重复的字符串,让其有序(字典顺序),而且还不能去