gpt4 book ai didi

java - 使用 Set 从 arrayList 中删除重复列表

转载 作者:搜寻专家 更新时间:2023-11-01 01:20:07 25 4
gpt4 key购买 nike

我有一个包含重复 ArrayList 的列表。

我正在寻找删除它们的解决方案。

这是一个例子:

listOne = [[1, 0], [0, 1], [3, 2], [2, 3]]

此集合包含重复列表。通常我想得到:

theListAfterTransformation  = [[1, 0],[3, 2]]

这是我的小例子,我尝试使用 Set 但效果不佳。

public class Example {
public static void main( String[] args ) {
ArrayList<ArrayList<Integer>> lists = new ArrayList<>();

ArrayList<Integer> list1 = new ArrayList<>(); list1.add(1); list1.add(0);
ArrayList<Integer> list2 = new ArrayList<>(); list2.add(0); list2.add(1);
ArrayList<Integer> list3 = new ArrayList<>(); list3.add(3); list3.add(2);
ArrayList<Integer> list4 = new ArrayList<>(); list4.add(2); list4.add(3);

lists.add(list1);lists.add(list2);lists.add(list3);lists.add(list4);

System.out.println(getUnduplicateList(lists));


}
public static ArrayList<ArrayList<Integer>> getUnduplicateList( ArrayList<ArrayList<Integer>> lists) {
Iterator iterator = lists.iterator();
Set<ArrayList<Integer>> set = new HashSet<>();
while (iterator.hasNext()){
ArrayList<Integer> list = (ArrayList<Integer>) iterator.next();
set.add(list);
}
return new ArrayList<>(set);
}

}

请注意,这是我项目中的一个小例子,很难使用一个解决方案来改变这个实现中的很多东西。

因此请注意 getUnduplicateList 应保持相同的签名。好主意是只改变实现。

此程序打印与输入相同的列表。请有任何想法。

最佳答案

一些关于术语的说明— Set是与 List 不同的数据结构,其中前者是无序的,不允许重复,而后者是基本的线性集合,通常是有序的,并且允许重复。您似乎在互换使用这些术语,这可能是您遇到的问题的一部分:Set 可能是此处合适的数据结构。

也就是说,您的代码似乎依赖于 List API,因此我们可以继续进行。请注意,一般来说,您应该针对接口(interface) (List) 而不是特定类 (ArrayList) 进行编码。

此外,考虑使用 Arrays.asList用于初始化列表的简写方法(请注意,这会返回一个不可变列表)。

最后,请注意 HashSet 通过检查两个对象是否具有相同的 hashCode 来消除重复项.包含相同元素的列表仍然不被认为是相同的列表,除非元素出现在 same order 中。 , 通常不会被视为重复项。但是,集合会实现 equalshashCode 这样包含完全相同元素的两个集合被认为是相等的(顺序无关紧要)。


使用您的原始起始集合,您可以将每个内部列表转换为一个集合。然后,从外部集合中消除重复项。最后,将内部集合转换回列表,以保持与其余代码的兼容性(如果需要)。无论内部列表的大小如何,这种方法都有效。

您可以使用 Stream 模拟这些步骤,并使用方法引用与 Set 相互转换,如下所示。


import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.stream.Collectors;

public class Example {

public static void main( String[] args ) {
List<Integer> list1 = Arrays.asList(1, 0);
List<Integer> list2 = Arrays.asList(0, 1);
List<Integer> list3 = Arrays.asList(3, 2);
List<Integer> list4 = Arrays.asList(2, 3);

List<List<Integer>> lists = Arrays.asList(list1, list2, list3, list4);

System.out.println(getUnduplicateList(lists));
}

public static List<List<Integer>> getUnduplicateList(List<List<Integer>> lists) {
return lists
.stream()
.map(HashSet::new)
.distinct()
.map(ArrayList::new)
.collect(Collectors.toList());
}
}

关于java - 使用 Set 从 arrayList 中删除重复列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53584698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com