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)数组(
)->按字母顺序排列,但仅按嵌套最多的(1D)数组(array
)的第一个元素排列array
- 最外层(3D)数组(
)按2D数组的大小排序(数组
)数组
欢迎提出任何建议。谢谢 您是否尝试过使用不允许重复的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();
}