我有一个包含重复对象的数组,比方说:[A,A,B,C]。通过for循环,我将重复项的名称合并为一个字符串。我试过了:
for (var i = 0; i < myArray.data.length - 1; i ++) {
for (var j = i + 1; j < myArray.data.length; j ++) {
if (myArray.data[i].id == myArray.data[j].id) {
identicalObjects = identicalObjects + myArray.data[i].name + ", " + myArray.data[j].name;
}
}
}
此打印:“ A,A”,这是正确的。但是,如果数组为[A,A,A,B,C],则打印不正确的“ A,A,A,A,A,A”,只有3个重复项而不是6个。字符串,因为在某些情况下,不同的对象(具有不同的ID)作为重复返回,并且我需要知道它们的名称才能知道它们到底是哪个。
我想到的一种解决方案是将名称存储在数组中,如果相同名称的数量大于2,则将其他名称的数量减半,然后转换为字符串。还有什么更简单有效的方法吗?
但是,如果数组是[A,A,A,B,C],它将打印“ A,A,A,A,A,A”]
这是因为当i = 0且j = 1时,您将获得一个匹配项,并且sameObjects设置为“ A,A”。当i = 0和j = 2时,您将获得另一个匹配项,并将sameObjects设置为其先前值加上“ A,A”。然后,当i = 1和j = 2时,您将获得另一个匹配并执行相同的串联。
为什么不使用Map对象并将该对象用作键,其值为计数?
这可能不是实现此目的的最直接方法,但我认为它应该可以完成工作。
var uniqueLetters = myArray.filter(distinct);
for(var i = 0; i < uniqueLetters.length; i++){
for(var j = 0; j < myArray.Length; j++){
if(myArray.data[j] == uniqueLetters[i]){
identicalObjects = identicalObjects + myArray.data[i].name + ", " + myArray.data[j].name;
}
}
}
例如,假设您有一个数组[A,A,B,C]。 uniqueLetters
将包含[A,B,C]。然后遍历原始数组,请检查不同的数组。
再次,这可能不是处理此问题的最直接方法,但它应该可以工作。
如果将对象数组转换为List,则将更加轻松,灵活。列表功能更强大,您可以使用列表做更多的事情。
在您的示例中,您尝试根据ID查找重复项。使用列表,可以用单句实现。
Map<Integer, List<YourObject>> yourObjectMap = empArray.stream().collect(Collectors.groupingBy(YourObject::getId));