gpt4 book ai didi

Java - 消除 3D 对象数组中的重复项

转载 作者:行者123 更新时间:2023-11-30 03:03:26 25 4
gpt4 key购买 nike

我有

 Array<Array<Array<CustomObject>>> 

我需要消除重复的

Array<Array<CustomObject>>

数组中的顺序并不重要,所以我不按索引进行比较,而是比较数组内的元素。最终结果需要保持3D数组格式。所以我不需要将数组展平为一个大数组。

我认为可能有帮助的一种方法是对数组进行排序。我必须像这样对数组进行排序:

  • 嵌套最多的(一维)数组 ( Array<CustomObject> ) -> 按名称字母顺序排列

  • 下一个(2D)数组 ( Array<Array<CustomObject>> ) -> 按字母顺序排列,但仅按最嵌套的 (1D) 数组 ( Array<CustomObject> ) 的第一个元素

  • 最外层(3D)数组 ( Array<Array<Array<CustomObject>>> ) 按 2D 数组 ( Array<Array<CustomObject>> ) 的大小排序

通过这三种方法,重复项应该一个挨着一个,但我不知道如何在不创建太多嵌套循环来比较元素的情况下消除它们。

当前实现的输出示例:

[[v1]、[v2、v3]]

[[v1,v2],[v3]]

[[v1,v2],[v3]]

[[v1,v2],[v2,v3]]

[[v1]、[v2、v3]]

[[v1,v2],[v2,v3]]

[[v1]、[v2]、[v3]]

[[v1]、[v2]、[v3]]

[[v1]、[v2]、[v3]]

[[v1]、[v2]、[v3]]

[[v1]、[v2]、[v3]]

[[v1]、[v2]、[v3]]

我已经尝试使用 Arrays.equal 和 deepequal,但它给了我一个错误,指出该方法无法应用于我的 CustomObjects 数组。

CustomObjects 类实现 Comparable,并且我重写 equals、hashCode 和compareTo。

欢迎任何建议。谢谢!

最佳答案

您必须找到“它们不同吗”这个问题的快速答案。

if x.length != y.length then they are different

快速而干净的答案。所以你按大小排序的想法非常好。

我们可以创建另一个“简单”字段来快速回答“不同”吗?是的,让我们计算每个哈希码并比较它们。如果哈希码不同 -> 对象不同。

要计算哈希码,我们可以使用 https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#deepHashCode(java.lang.Object[]) ..但如果数组内的顺序不重要,那么在您的情况下它会中断,在您的情况下 [a,b,c] == [b,a,c],但与 deepHashCode 会有不同的结果。

要对抗它 - 在使用 deepHashCode 之前对数组元素进行排序。

所以:

  • 对所有 L1 数组进行排序,
  • 对所有 L2 数组进行排序(我认为您不应该停在比较器中的第一个元素上)
  • 创建一个 Map[Integer,List[Element]] 并为每个 L3 deepHashCode -> List[L3] 填充它

稍后迭代:

List<Element> result = ...

for (List<Element> l : map.values()) {
if ( l.size() > 1 ) {
final Iterator i = l.iterator();
Element head = i.next();
while (i.hasNext()) {
Element cur = i.next();
if (comparator.compare(head,cur) == 0) {
i.remove();
}
head = cur;
}
}
result.addAll(l);
}
return result.toArray(..);

关于Java - 消除 3D 对象数组中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35388009/

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