Java 如何在对象数组中检查对象的重复值,合并重复值';值,然后删除副本?
现在我有一系列的“龙”。每个项目有两个值。一个身份证和一个计数。因此,我的数组将如下所示:Java 如何在对象数组中检查对象的重复值,合并重复值';值,然后删除副本?,java,arrays,sorting,object,duplicates,Java,Arrays,Sorting,Object,Duplicates,现在我有一系列的“龙”。每个项目有两个值。一个身份证和一个计数。因此,我的数组将如下所示: Dragon[] dragons = { new Dragon(2, 4), new Dragon(83, 199), new Dragon(492, 239), new Dragon(2, 93), new Dragon(24,
Dragon[] dragons = { new Dragon(2, 4),
new Dragon(83, 199),
new Dragon(492, 239),
new Dragon(2, 93),
new Dragon(24, 5)
};
如你所见,我有两条ID为2的龙在数组中。我想完成的是,当发现一个复制品时,只需将复制品的数量添加到第一个复制品的数量中,然后移除复制品
我已经成功地完成了这一点,但是我最终会在数组的中间加上一个NULL,我不知道如何删除NULL然后再拖动它们。p> 这就是我目前所拥有的,但它确实不能正常工作:
public static void dupeCheck(Dragon[] dragons) {
int end = dragons.length;
for (int i = 0; i < end; i++) {
for (int j = i + 1; j < end; j++) {
if (dragons[i] != null && dragons[j] != null) {
if (dragons[i].getId() == dragons[j].getId()) {
dragons[i] = new Item(dragons[i].getId(), dragons[i].getCount() + dragons[j].getCount());
dragons[j] = null;
end--;
j--;
}
}
}
}
}
publicstaticvoiddupecheck(Dragon[]dragons){
int end=龙的长度;
for(int i=0;i
您可能被迫将结果存储在数组中,但这并不意味着您总是被迫使用数组
一种解决方案是使用
流
API,将添加计数的项目分组,并将结果再次保存到数组中。您可以获得如何使用流
API对值求和的示例。将列表
转换为T[]
非常简单,但无论如何,您有一个例子您很可能不应该维护dragon类中每个龙的龙数
除此之外,即使你被迫使用一个数组,你也应该创建一个交互地图来存储你的龙
Map<Integer, Dragon> idToDragon = new HashMap<>();
for (Dragon d : yourArray) {
// fetch existing dragon with that id or create one if none present
Dragon t = idToDragon.computeIfAbsent(d.getId(), i -> new Dragon(i, 0));
// add counts
t.setCount(t.getCount() + d.getCount());
// store in map
idToDragon.put(d.getId(), t);
}
数组的大小在创建后无法更改 因此,您需要返回包含合并龙的新数组或列表
public static Dragon[] merge(Dragon[] dragonArr) {
return Arrays.stream(dragonArr)
// 1. obtain a map of dragon IDs and their combined counts
.collect(groupingBy(Dragon::getId, summingInt(Dragon::getCount)))
// 2. transform the map entries to dragons
.entrySet().stream().map(entry -> new Dragon(entry.getKey(), entry.getValue()))
// 3. collect the result as an array
.toArray(Dragon[]::new);
}
到目前为止你得到了什么?简单的方法是创建一个列表,遍历数组,检查id是否存在,如果存在,则添加count,否则,添加objectSo,这意味着
Dragon
对象同时具有其id和人口计数?对我来说,这听起来像是一个设计缺陷……使用ArrayList而不是数组怎么样。然后您就可以remove()
dragon@Tschallacka因为“移除”不是他想要做的,你是被迫使用数组的吗?如果没有,请考虑将数据传输到地图。似乎更适合这个问题。
public static Dragon[] merge(Dragon[] dragonArr) {
return Arrays.stream(dragonArr)
// 1. obtain a map of dragon IDs and their combined counts
.collect(groupingBy(Dragon::getId, summingInt(Dragon::getCount)))
// 2. transform the map entries to dragons
.entrySet().stream().map(entry -> new Dragon(entry.getKey(), entry.getValue()))
// 3. collect the result as an array
.toArray(Dragon[]::new);
}