如何获得数组的唯一列表?

How to get unique list of array?

我有整数数组列表

Integer[] i1 = new Integer[2]; i1[0] = 1; i1[1] = 1;
Integer[] i2 = new Integer[2]; i2[0] = 1; i2[1] = 1;
Integer[] i3 = new Integer[2]; i3[0] = 0; i3[1] = 0;

List<Integer[] arrayList = new ArrayList<>();
arrayList.add(i1);
arrayList.add(i2);
arrayList.add(i3); 

如何从该列表中删除重复的数组 i2?

常规集合不检查数组是否相等。所以你不能依赖要删除的重复数组。

Integer[] i1 = new Integer[2]; i1[0] = 1; i1[1] = 1;
Integer[] i2 = new Integer[2]; i2[0] = 1; i2[1] = 1;
Integer[] i3 = new Integer[2]; i3[0] = 0; i3[1] = 0;

List<Integer[]> list1   = List.of(i1,i2,i3);
Set<Integer[]> set = new HashSet<>();
set.addAll(list1);
set.forEach(arr->System.out.println(Arrays.toString(arr)));

打印

[0, 0]
[1, 1]
[1, 1]

不过你也可以这样做。

  • TreeSet 定义一个比较器,并将其用于数组中的重复检测。
Comparator<Integer[]> comp = (a,b)->Arrays.compare(a,b);

Set<Integer[]> set = new TreeSet<>(comp);
set.addAll(list1);
set.forEach(a->System.out.println(Arrays.toString(a));

打印

[0, 0]
[1, 1]

请注意,集合中数组的顺序可能与它们在列表中的顺序不同。要保留遇到顺序,您可以使用有状态过滤器,该过滤器记录检查是否已经看到数组。

Set<Integer[]> seen = new TreeSet<>((a, b) -> Arrays.compare(a, b));
List<Integer[]> result =
        list1.stream().filter(seen::add).toList();

注意: 这应该只在 sequential streams 中使用。并行操作可能会导致竞争条件,从而导致结果不准确。

如果要保持原列表中条目的顺序,并且原列表是可变的,也可以使用List.removeIf:

Comparator<Integer[]> comp = (a,b)->Arrays.compare(a,b);
Set<Integer[]> set = new TreeSet<>(comp); 
yourList.removeIf(x -> !set.add(x));

(基于 Holger 对相关问题的回答 comment