Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-消除3D对象数组中的重复项_Java_Arrays_Multidimensional Array_Duplicates - Fatal编程技术网

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

Java-消除3D对象数组中的重复项,java,arrays,multidimensional-array,duplicates,Java,Arrays,Multidimensional Array,Duplicates,我有 数组 我需要消除 Array<Array<Array<CustomObject>>> 数组 数组中的顺序无关紧要,所以我不按索引进行比较,而是比较数组中的元素。最终结果需要保持3D数组格式。因此,我不需要将阵列展平为一个大阵列 我认为可能有帮助的一种方法是对数组进行排序。 我要对数组进行如下排序: 最嵌套的(1D)数组(array)->按名称的字母顺序排列 下一个(2D)数组(array)->按字母顺序排列,但仅按嵌套最多的(1D)数组(ar

我有

数组
我需要消除

 Array<Array<Array<CustomObject>>> 
数组
数组中的顺序无关紧要,所以我不按索引进行比较,而是比较数组中的元素。最终结果需要保持3D数组格式。因此,我不需要将阵列展平为一个大阵列

我认为可能有帮助的一种方法是对数组进行排序。 我要对数组进行如下排序:

  • 最嵌套的(1D)数组(
    array
    )->按名称的字母顺序排列

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

  • 最外层(3D)数组(
    数组
    )按2D数组的大小排序(
    数组
通过这三种方法,重复项应该一个挨着一个,但我不知道如何在不创建太多嵌套循环来比较元素的情况下消除它们

当前实现的输出示例:

[[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和I重写equals、hashCode和compareTo


欢迎提出任何建议。谢谢

您是否尝试过使用不允许重复的Collections类列表?或者ArrayList,它允许重复,并且有测试是否相等的方法?

您必须找到“它们是否不同”问题的快速答案

快速而清晰的回答。所以你按大小排序的想法真的很好

我们能不能用另一个“简单”字段快速回答“不同”?是的,让我们为每一个计算hashcode并比较它们。如果哈希代码不同->对象不同

Array<Array<CustomObject>>
要计算哈希代码,我们可以使用。。但是,如果数组中的顺序不重要,它将在您的情况下中断,[a,b,c]=[b,a,c]在您的情况下,但将与deepHashCode有不同的结果

要解决这个问题,请在使用deepHashCode之前对数组元素进行排序

因此:

  • 对所有L1数组进行排序
  • 对所有L2数组进行排序(我认为您不应该停留在比较器中的第一个元素上)
  • 制作一个映射[Integer,List[Element]],并为每个L3 deepHashCode->List[L3]填充它
然后迭代:

if x.length != y.length then they are different
列表结果=。。。
对于(列表l:map.values()){
如果(l.size()>1){
最终迭代器i=l.迭代器();
元素头=i.next();
while(i.hasNext()){
元素cur=i.next();
if(比较器比较(磁头、电流)==0){
i、 删除();
}
头=电流;
}
}
结果:addAll(l);
}
返回结果。toArray(…);

如果您只是在寻找不同的元素,一种简单的方法是展平3D阵列。在Java-8中,可以使用以下方法将3D数组展平为

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(..);
编辑:如果您使用的是早期的JVM,并且可以接受1D数组,请使用
删除重复项:

 CustomObject[] noDupes = flatten(arr).distinct().toArray();
public T[]distinct(T[]arr){
Set noDupes=new HashSet();
对于(T[][]oll:arr){
对于(T[]ol:oll){
addAll(Arrays.asList(ol));
}
}
return(T[])noDupes.toArray();
}

请参见。您的最终答案必须是三维的吗?或者如果阵列被展平了可以吗?另外,从哪个阵列中删除重复项是否重要?编辑:数组是指CustomObject[][]吗?是的,我需要数组保留在此表单中。我不能把它们压扁。我必须检查2D数组是否包含相同的元素(无论顺序如何)。正如您在示例中所看到的,最后6个数组是相同的,因此我需要消除重复。数组2和3也是如此。我只需要保留2D数组的一个外观。
List
允许重复。一个
集合
不起作用。它起作用了!我使用了hashCode的想法。首先,我将ArrayList转换为CustomObject[][],然后在CustomObject[]]上应用deepHashCode并将其存储到HashMap中。最后,我将CustomObject[][]从hashmap转换回ArrayList(因此我返回到所需的格式)。@陌生人,我很高兴它起到了作用!您从草图中获得了想法,并编写了工作代码。伟大的顺便说一句:如果你有嵌套的ArrayList(不是数组)作为传入结构,那么你就有了“list.hashCode”方法,而且据我所知,数组列表中的这个hashCode是一个“深度哈希代码”,它将遍历列表中的所有元素。但是您仍然需要对其中的元素(Collection.sort())进行排序以获得一致的哈希代码。如果它们具有相同的元素,我需要比较整个2D数组,因此我需要将每个2D数组中的1D数组与其他2D数组中的其他1D数组进行比较。例如:在问题中给出的示例中,需要修剪最后6个二维数组,因为它们是相同的,但另一方面,第一个二维数组和第二个二维数组(第一行和第二行)不是相同的二维数组。
 CustomObject[] noDupes = flatten(arr).distinct().toArray();
public <T> T[] distinct(T[][][] arr){
    Set<T> noDupes = new HashSet<>();

    for(T[][] oll: arr){
        for(T[] ol: oll){
            noDupes.addAll(Arrays.asList(ol));
        }
    }
    return (T[]) noDupes.toArray();
}