【问题标题】:How to remove duplicate elements from list<String>? [duplicate]如何从 list<String> 中删除重复元素? [复制]
【发布时间】:2019-07-03 01:21:21
【问题描述】:

列表列表 = ["f1,f2","f2,f3","f4,f5","f2,f1","f5,f4"];

输出列表将是 列表 uniqueList = ["f1,f2","f2,f3","f4,f5"]

【问题讨论】:

  • 通过一个集合传递它们。
  • @shmosel 没那么简单。 f2,f1f1,f2 在逻辑上被认为是等效的。
  • @TimBiegeleisen 错过了,很好。
  • 这个怎么样:list.stream().map(s -&gt; Set.of(s.split(","))).distinct().map(s -&gt; String.join(",", s)).collect(Collectors.toList())
  • 我收到了comile time错误-无法推断 map(Function super T,? extends R>) 的类型参数

标签: java arrays collections java-8


【解决方案1】:

我有另一个解决方案。如果您不想准备另一个类来比较 List 中的值。您可以用逗号分隔每个值并对这些数据进行排序。之后,您可以再次将它们转换为 Set of String

public static void main(String[] args) {
    List<String> stringList = Arrays.asList("f1,f2", "f2,f3", "f4,f5", "f2,f1", "f5,f4");
    Set<String> result = new HashSet<>();
    for (String s : stringList) {
        String[] elements = s.split(",");
        Arrays.sort(elements);
        result.add(Arrays.toString(elements));
    }

    for (String e : result){
        System.out.println(e);
    }
}

【讨论】:

    【解决方案2】:

    使用额外的类:

        static class Pair {
        String a, b;
    
        Pair(String s) {
            String[] arr = s.split(",");
            this.a = arr[0];
            this.b = arr[1];
        }
    
        static String pairToString(Pair p) {
            return p.a + "," + p.b;
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(a, b) + Objects.hash(b, a);
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Pair p = (Pair) o;
            return (p.a.equals(a) && p.b.equals(b)) || (p.b.equals(a) && p.a.equals(b));
        }
    

    }

    现在你可以使用了:

     public static void main(String[] args) {
            List<String> list = Arrays.asList("f1,f2", "f2,f3", "f4,f5", "f2,f1", "f5,f4");
            List<String> strings = list
                    .stream()
                    .map(Pair::new)
                    .distinct()
                    .map(Pair::pairToString)
                    .collect(Collectors.toList());
        }
    

    【讨论】:

      【解决方案3】:

      我创建了一个类来对这些对进行建模并覆盖 equals 方法以将“f1,f2”和“f2,f1”视为相等,然后使用 HashSet 找出重复项。

      import java.util.ArrayList;
      import java.util.Arrays;
      import java.util.HashSet;
      import java.util.Iterator;
      import java.util.List;
      
      public class so1 {
          public static void main(String[] args) {
      
              List<String> list = Arrays.asList(new String[] {"f1,f2","f2,f3","f4,f5","f2,f1","f5,f4"});
      
              List<pair> plist = new ArrayList<pair>();
              for (int i = 0; i < list.size(); i++) {
                  plist.add(new pair(list.get(i)));
              }
      
              HashSet<pair> hs = new HashSet<pair>(); 
              for (int i = 0; i < plist.size(); i++) {
                  if(!hs.add(plist.get(i))){
                      System.out.println("Found duplicate "+plist.get(i).toString());
                  }
              }
      
              List<String> uniqueItems = new ArrayList<String>();
              for (Iterator iterator = hs.iterator(); iterator.hasNext();) {
                  pair pair = (pair) iterator.next();
                  uniqueItems.add(pair.toString());
              }
      
              System.out.println(uniqueItems);
      
      
          }
      }
      
      class pair{
          pair(String inp){
              String[] tokens = inp.split(",");
              Arrays.sort(tokens);
              for(String t: tokens){
                  elements.add(t);
              }
          }
          List<String> elements = new ArrayList<>();
      
          @Override
          public String toString() {
              return ""+elements;
          }
      
          @Override
          public int hashCode() {
              final int prime = 31;
              int result = 1;
              result = prime * result + ((elements == null) ? 0 : elements.hashCode());
              return result;
          }
      
          @Override
          public boolean equals(Object obj) {
              if (this == obj)
                  return true;
              if (obj == null)
                  return false;
              if (getClass() != obj.getClass())
                  return false;
              pair other = (pair) obj;
              if (elements == null) {
                  if (other.elements != null)
                      return false;
              } else if (!elements.equals(other.elements))
                  return false;
              return true;
          }
      }
      

      【讨论】:

        【解决方案4】:

        这里有几个来自https://www.geeksforgeeks.org/how-to-remove-duplicates-from-arraylist-in-java/的答案

        Java 7

            // Create a new ArrayList 
            ArrayList<String> uniqueList = new ArrayList<String>(); 
        
            // Traverse through the first list 
            for ( element : list) { 
        
                // If this element is not present in uniqueList
                // then add it 
                if (!uniqueList.contains(element)) { 
        
                    uniqueList.add(element); 
                } 
            } 
        

        Java 8

            List<String> uniqueList = list.stream() 
                .distinct() 
                .collect(Collectors.toList()); 
        

        【讨论】:

        猜你喜欢
        • 2018-08-08
        • 1970-01-01
        • 1970-01-01
        • 2018-06-14
        • 2015-06-20
        • 2014-11-11
        • 2019-09-02
        • 2020-02-22
        • 1970-01-01
        相关资源
        最近更新 更多