我有一个对象列表(他们总是不喜欢这个,有更少或更多,这取决于)
[1xtile.air@0, 1xtile.air@0, 16xitem.enderPearl@0, 64xitem.eyeOfEnder@0, 16xitem.enderPearl@0, 64xitem.blazeRod@0, 1xitem.enchantedBook@0, 64xitem.blazeRod@0, 16xitem.enderPearl@0, 64xitem.eyeOfEnder@0, 16xitem.enderPearl@0]
就像你看到它们中的大多数具有相同的名称一样,这个对象有getCount()方法,它返回一个对象中的项目数量。 我想知道我怎么能合并所有具有相同名称的对象(我用getUnlocalizedName()得到对象名称)但是用每个对象的getCount()增加它们的计数,所以例如我有
[16xitem.enderPearl@0, 10xitem.enderPearl@, 1xtile.air@0]
第一个计数是16和第二个10我想将它们合并在一起并得到一个如下所示的列表:[26xitem.enderPearl@0, 1xtile.air@0]
,
还有setCount(int)方法,以便可以用来设置新对象的计数。
我尝试了这个(列表叫做堆栈,就像上面的例子一样)
List<ItemStack> newStacks = Lists.newArrayList();
for (int index = 0; index < stacks.size(); index++) {
ItemStack stack = stacks.get(index);
ListIterator<ItemStack> iterator = stacks.listIterator();
while (iterator.hasNext()) {
int index1 = iterator.nextIndex();
ItemStack itemStack = iterator.next();
if (index != index1 && stack.getUnlocalizedName().equals(itemStack.getUnlocalizedName())) {
newStacks.removeIf(itemStack1 -> itemStack1.getUnlocalizedName().equals(itemStack.getUnlocalizedName()));
stack.setCount(stack.getCount() + itemStack.getCount());
}
}
newStacks.add(stack);
}
但我得到[36xitem.enderPearl@0, 1xtile.air@0]
答案 0 :(得分:0)
想出来,正确的方法是通过复制itemstack(复制方法从当前ItemStack复制所有数据并返回一个新数据)从列表中删除,因为它在列表本身中发生了变化,因此在第二次迭代时它将第二个对象中的10添加到第一个对象,在第一次迭代时将其更改为26。
List<ItemStack> newStacks = Lists.newArrayList();
for (int index = 0; index < stacks.size(); index++) {
ItemStack stack = stacks.get(index).copy();
ListIterator<ItemStack> iterator = stacks.listIterator();
while (iterator.hasNext()) {
int index1 = iterator.nextIndex();
ItemStack itemStack = iterator.next();
if (index != index1 && stack.getUnlocalizedName().equals(itemStack.getUnlocalizedName())) {
newStacks.removeIf(itemStack1 -> itemStack1.getUnlocalizedName().equals(itemStack.getUnlocalizedName()));
stack.grow(itemStack.getCount()); // the equivalent of stack.setCount(stack.getCount() + itemStack.getCount());
}
}
}
newStacks.add(stack);
}