当前位置: 首页 > 知识库问答 >
问题:

如何在Java中从ArrayList中删除重复对?

籍兴文
2023-03-14
class Pair<t1,t2>
{
    int i, j;
    Pair(int i,int j){
        this.i=i;
        this.j=j;
    }

}

public class My 
{
    public static void main(String[] args) {
        Pair p;
        List<Pair<Integer,Integer>> src = Arrays.asList(new Pair(1,2), 
            new Pair(2,3), new Pair(2,1),new Pair(1,2));
        HashSet<String> dest  = new HashSet();

        for(int i=0; i < src.size(); i++) {
            p=src.get(i);
            if(dest.contains(p.j+" "+p.i)) {
                System.out.println("duplicacy");
            }  
            else {
                dest.add(p.i+" "+p.j);
            }
         
        }
        System.out.println("set is = "+dest);
     
        List<Pair<Integer,Integer>> ans=new ArrayList();
        String temp;
        int i,j;
        Iterator<String> it=dest.iterator();
        while(it.hasNext()) 
        {
            temp=it.next();
            i=Integer.parseInt(temp.substring(0,temp.indexOf(' ')));
            j=Integer.parseInt(temp.substring(temp.indexOf(' 
               ')+1,temp.length()));
            ans.add(new Pair(i,j));
         }
    
         for(Pair i_p:ans) {
             System.out.println("Pair = "+i_p.i+" , "+i_p.j);
         }

     }//end of main method
 }//end of class My

这段代码运行良好,但我想知道它的性能,我指的是它的总体时间复杂度?

共有1个答案

姬俊远
2023-03-14

>

  • 如果可以修改pair类,只需实现equals()hashcode():

    public class Pair {
        private int a;
        private int b;
    
        public Pair(int a, int b) {
            this.a = a;
            this.b = b;
        }
    
        @Override
        public boolean equals(Object o) { 
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Pair pair = (Pair) o;
            return (a == pair.a && b == pair.b) || (a == pair.b && b == pair.a);
        }
    
        @Override
        public int hashCode() {
            return Objects.hashCode(new HashSet<>(Arrays.asList(a,b))); 
        }
    
        @Override
        public String toString() {
            return "Pair{" +
                    "a=" + a +
                    ", b=" + b +
                    '}';
        }
    }
    

    然后只需创建一个新的:

    List<Pair> pairs = Arrays.asList(new Pair(1, 2), new Pair(2, 1), new Pair(3, 2));
    
    Set<Pair> pairSet = new HashSet<>(pairs);
    
    System.out.println(pairSet);
    

    输出:

    [Pair{a=1, b=2}, Pair{a=3, b=2}]
    
    List<Pair> pairs = Arrays.asList(new Pair(1, 2), new Pair(2, 1), new Pair(3, 2));
    
    Set<Pair> pairSet = pairs.stream()
          .map(pair -> new HashSet<>(Arrays.asList(pair.getA(), pair.getB())))
          .distinct()
          .map(integers -> {
              Iterator<Integer> iterator = integers.stream().iterator();
              return new Pair(iterator.next(), iterator.next());
          })
          .collect(Collectors.toSet());
    
    System.out.println(pairSet);
    
    [Pair{a=1, b=2}, Pair{a=2, b=3}]
    
    List<Pair> list = new ArrayList<>(set);
    

  •  类似资料:
    • 我有一个arraylist,它包含一对整数(例如int i,int j)。但它可能包含重复对(如(int i,int j)和(int j,int i))。现在如何在O(n)时间复杂度中去除重复。

    • 所以我正在尝试创建这个循环,它可以从ArrayList中移除给定字符串中的特定字符。问题是,当一行中有两个相同的字符时,它会遗漏第二个字符,因为当第一个字符被移除时,第二个字符会在数组列表中向下推一个位置。这是我目前所掌握的。有人知道怎么解决这个吗?我仍然是java的初学者,所以任何帮助都将非常感谢。 从本例中打印出来的内容在:[u,B,u,o,p]之后,而我希望它在:[u,u,o,p]之后

    • 问题内容: 我有一个,并且我想从中删除重复的字符串。我怎样才能做到这一点? 问题答案: 如果你不想在中添加重复项,则应考虑为什么要使用允许重复项的。删除重复元素的最简单方法是将内容添加到中(不允许重复),然后将其添加回中: 当然,这破坏了中元素的顺序。

    • 我需要编写一个逻辑来检查一个列表是否有任何重复项,如果有,它会删除它们,并返回一个新的列表,其中包含没有重复/删除的项。下面是我尝试过但没有成功的方法。 Customer.java: 以下是添加后的响应列表: 在上面列出两个具有相同细节的对象的情况下,(即)["id": 123]是重复的。我在所有对象中添加了String(),equals(),hashcode(),并将其传递给hashSet 但我

    • 但是我们不能在集合中存储HashMap。我想要HashMap与键,值对作为返回值,这将被添加到列表中。也就是说,最终的值应该采用ArrayList>格式。 你能在这方面帮助我吗?谢了。

    • 问题内容: 如何从ArrayList中删除重复的元素? 问题答案: 如果你不想在中添加重复项,则应考虑为什么要使用允许重复项的。删除重复元素的最简单方法是将内容添加到中(不允许重复),然后将其添加Set回中ArrayList: 当然,这会破坏中的元素顺序。