zoukankan      html  css  js  c++  java
  • 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();
     
  • 相关阅读:
    python Database Poll for SQL SERVER
    SQLAlchemy表操作和增删改查
    flask动态url规则
    flask配置管理
    一个Flask运行分析
    Function Set in OPEN CASCADE
    Happy New Year 2016
    Apply Newton Method to Find Extrema in OPEN CASCADE
    OPEN CASCADE Multiple Variable Function
    OPEN CASCADE Gauss Least Square
  • 原文地址:https://www.cnblogs.com/sxc1991/p/7356369.html
Copyright © 2011-2022 走看看