• List集合去重方法汇总


    大部分是采用两种方法,一种是用遍历list集合判断后赋给另一个list集合,一种是用赋给set集合再返回给list集合。

        //set集合去重,不打乱顺序
        public static void main(String[] args){
             List<String> list  =   new  ArrayList<String>(); 
             list.add("aaa");
             list.add("bbb");
             list.add("aaa");
             list.add("aba");
             list.add("aaa");
    
             Set set = new  HashSet(); 
             List newList = new  ArrayList(); 
             for (String cd:list) {
                if(set.add(cd)){
                    newList.add(cd);
                }
            }
             System.out.println( "去重后的集合: " + newList); 
          }
         //遍历后判断赋给另一个list集合
         public static void main(String[] args){
             List<String> list  =   new  ArrayList<String>(); 
             list.add("aaa");
             list.add("bbb");
             list.add("aaa");
             list.add("aba");
             list.add("aaa");
    
             List<String> newList = new  ArrayList<String>(); 
             for (String cd:list) {
                if(!newList.contains(cd)){
                    newList.add(cd);
                }
            }
             System.out.println( "去重后的集合: " + newList); 
          }
        //set去重
        public static void main(String[] args){
             List<String> list  =   new  ArrayList<String>(); 
             list.add("aaa");
             list.add("bbb");
             list.add("aaa");
             list.add("aba");
             list.add("aaa");
    
            Set set = new  HashSet(); 
             List newList = new  ArrayList(); 
             set.addAll(list);
             newList.addAll(set);
    
             System.out.println( "去重后的集合: " + newList); 
         }
            //set去重(缩减为一行)
            public static void main(String[] args){
                 List<String> list  =   new  ArrayList<String>(); 
                 list.add("aaa");
                 list.add("bbb");
                 list.add("aaa");
                 list.add("aba");
                 list.add("aaa");
    
                 List newList = new ArrayList(new HashSet(list)); 
    
                 System.out.println( "去重后的集合: " + newList); 
             }

    hashset不进行排序,还有一种方法是用treeset,去重并且按照自然顺序排列,将hashset改为treeset就可以了。(原本的顺序是改变的,只是按照字母表顺序排列而已)

    //去重并且按照自然顺序排列
    List newList = new ArrayList(new TreeSet(list)); 


    ==============================================================================================================================================================================

    因为用到list,要去除重复数据,尝试了几种方法。记录于此。。。

    测试数据:

            List<string> li1 = new List<string> { "8", "8", "9", "9" ,"0","9"};
                List<string> li2 = new List<string> { "张三", "张三", "李四", "张三", "王五", "李四" };
                List<string> li3 = new List<string> { "A", "A", "C", "A", "C", "D" };
                List<string> li4 = new List<string> { "12", "18", "19", "19", "10", "19" };

    方法一:

    HashSet<string> hs = new HashSet<string>(li1); //此时已经去掉重复的数据保存在hashset中

    方法二:

    复制代码
    复制代码
    for (int i = 0; i < li2.Count; i++)  //外循环是循环的次数
                {
                    for (int j = li2.Count - 1 ; j > i; j--)  //内循环是 外循环一次比较的次数
                    {
    
                        if (li2[i] == li2[j])
                        {
                            li2.RemoveAt(j);
                        }
    
                    }
                }
    复制代码
    复制代码

    方法三:

    复制代码
    复制代码
          //把相同的用null代替。
                for (int i = 0; i < li3.Count; i++)
                {
                    for (int j = 0; j < li3.Count; j++)
                    {
                        if (i == j) continue;
    
                        if (li3[i] == li3[j])
                        {
                            li3[j] = "null";
                        }
    
                    }
                }
    复制代码
    复制代码

    方法四:

    复制代码
    复制代码
            //这方法跟上面的一样,只是变了逻辑
                for (int i = 0; i < li4.Count - 1; i++)
                {
                    for (int j = 0; j < li4.Count ; j++)
                    {
                        if (i != j)
                        {
                            if (li4[i] == li4[j])
                            {
                                li4[j] = "null";
                            }
                        }
                    }
                }
    复制代码
    复制代码

    最后输出看结果

    复制代码
    复制代码
            Console.WriteLine("li1去除重复后的值为");
                hs.ToList().ForEach(item => Console.WriteLine(item));
    
                Console.WriteLine("li2去除重复后的值为");
                li2.ForEach(item => Console.WriteLine(item));
    
                Console.WriteLine("li3去除重复后的值为");
                li3.ForEach(item => Console.WriteLine(item));
    
                Console.WriteLine("li4去除重复后的值为");
                li4.ForEach(item => Console.WriteLine(item));
    复制代码
    复制代码

    null我没去掉。用的时候去掉即可。

    当然。还有许多办法。比如linq  Distinct  等等都可以,看看网上的这个例子:去掉modelList中title重复的内容,不区分大小写

    复制代码
    复制代码
     class Program
        {
            static void Main(string[] args)
            {
                List<Model> modelList = new List<Model>() 
                { new Model() { ID = 1, Title = "abcde" },
                    new Model() { ID = 2, Title = "ABCDE" },
                    new Model(){ ID = 3, Title = "AbcdE" },
                    new Model() { ID = 4, Title = "A" }, 
                    new Model() { ID = 5, Title = "a" } 
                };
                Console.Read();
            }
        }
        public class Model
        {
            public int ID { get; set; }
            public string Title { get; set; }
        }
    复制代码
    复制代码

    解决方案一:这里比较的前提是对象的哈希代码相等。否则不会比较,因为哈希代码不相等。两个对象显然不相等

    复制代码
    复制代码
    //定义一个类继承IEqualityComparer接口
        public class ModelComparer : IEqualityComparer<Model>
        {
            public bool Equals(Model x, Model y)
            {
                return x.Title.ToUpper() == y.Title.ToUpper();
            }
            public int GetHashCode(Model obj)
            {
                return obj.Title.ToUpper().GetHashCode();
            }
        }
    复制代码
    复制代码

    调用:

    modelList = modelList.Distinct(new ModelComparer()).ToList();

    解决方案二:

    复制代码
    var title = modelList.GroupBy(m => m.Title.ToLower().Trim()).Select(m => new { ID = m.FirstOrDefault().ID });
                modelList = modelList.Where(m => title.Select(mo => mo.ID).Contains(m.ID)).ToList(); 
                foreach (var item in modelList)
                {
                    Console.WriteLine(item.ID + "	" + item.Title);
                }
    复制代码

    当然。如果你仅仅比较两个值是否相等。

     List<string> li1 = new List<string> { "8", "8", "9", "8", "0", "9" };
                li1 = li1.Distinct().ToList();
     
  • 相关阅读:
    ObjectiveC的算术表达式 .
    《ObjectiveC 程序设计(第4版)》图书信息
    实例变量的访问及数据封装
    Android系统中的广播(Broadcast)机制简要介绍和学习计划 .
    Android应用程序的Activity启动过程简要介绍和学习计划 .
    如何在Scala中使用条件表达式 .
    Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划
    Android应用程序组件Content Provider简要介绍和学习计划
    asp.net怎么将网页添加为首页或加入收藏夹中
    学习网址
  • 原文地址:https://www.cnblogs.com/sxc1991/p/7356369.html
Copyright © 2020-2023  润新知