删除重复对象并求和字段值
Removing duplicate objects and summing field values
我正在尝试从 ArrayList
中删除重复对象并对某个字段的值求和。例如:
如果我有一个 ArrayList
对象 "Hardware":
{[Name: Ram, Quantity: 2],
[Name: Keyboard, Quantity: 3],
[Name: Mouse, Quantity: 5],
[Name: Keyboard, Quantity 5]}
我想编写一个函数来查找重复项并对数量求和。在这种情况下,键盘是重复的,所以最终的 ArrayList
应该是这样的:
{[Name: Ram, Quantity: 2],
[Name: Keyboard, Quantity: 8],
[Name: Mouse, Quantity: 5]}.
我试过了,好像有时能用,但有时会漏元素。
List<Hardware> myList = new ArrayList<Hardware>();
myList.add(new Hardware("Ram", 2);
myList.add(new Hardware("Keyboard", 3);
myList.add(new Hardware("Mouse", 5);
myList.add(new Hardware("Keyboard", 5);
for(int i = 0; i < list.size(); i++){
Hardware current = list.get(i);
for(int j = 1; j < list.size(); j++){
Hardware compare = list.get(j);
if(current.getName().equals(compare.getName)){
current.setQuantity(current.getQuantity()
+ compare.getQuantity())
list.remove(compare);
}
}
}
- 如果您删除了项目,您不想增加
j
;它会让您跳过紧随其后的项目。
- 您不想在
1
开始第二个循环,您想在 i+1
开始它,因为您不需要检查任何先前的元素。
- 您的示例有一些语法错误,您将
myList
更改为 list
,并且缺少一些括号和一个分号
试试这个:
List<Hardware> list = new ArrayList<Hardware>();
list.add(new Hardware("Ram", 2));
list.add(new Hardware("Keyboard", 3));
list.add(new Hardware("Mouse", 5));
list.add(new Hardware("Keyboard", 5));
list.add(new Hardware("Mouse", 1));
for (int i = 0; i < list.size(); i++) {
Hardware current = list.get(i);
for (int j = i + 1; j < list.size(); j++) {
Hardware compare = list.get(j);
if (current.getName().equals(compare.getName())) {
current.setQuantity(current.getQuantity() + compare.getQuantity());
list.remove(compare);
j--;
}
}
}
您还应该查看此 link 以帮助您解决未来的此类问题:
注意你写了 O(n*n) 算法
它仅在 list.size()
较小时工作正常。您可能会在这里获得 O(n) 性能:
Map<String, Hardware> hardwareMap = new HashMap<>();
for(Hardware h : myList){
Hardware current = hardwareMap.get(h.getName());
if(current == null){
hardwareMap.put(h.getName(), h);
}else{
current.setQuantity(current.getQuantity() + h.getQuantity());
}
}
Collection<Hardware> list = hardwareMap.values();
我正在尝试从 ArrayList
中删除重复对象并对某个字段的值求和。例如:
如果我有一个 ArrayList
对象 "Hardware":
{[Name: Ram, Quantity: 2],
[Name: Keyboard, Quantity: 3],
[Name: Mouse, Quantity: 5],
[Name: Keyboard, Quantity 5]}
我想编写一个函数来查找重复项并对数量求和。在这种情况下,键盘是重复的,所以最终的 ArrayList
应该是这样的:
{[Name: Ram, Quantity: 2],
[Name: Keyboard, Quantity: 8],
[Name: Mouse, Quantity: 5]}.
我试过了,好像有时能用,但有时会漏元素。
List<Hardware> myList = new ArrayList<Hardware>();
myList.add(new Hardware("Ram", 2);
myList.add(new Hardware("Keyboard", 3);
myList.add(new Hardware("Mouse", 5);
myList.add(new Hardware("Keyboard", 5);
for(int i = 0; i < list.size(); i++){
Hardware current = list.get(i);
for(int j = 1; j < list.size(); j++){
Hardware compare = list.get(j);
if(current.getName().equals(compare.getName)){
current.setQuantity(current.getQuantity()
+ compare.getQuantity())
list.remove(compare);
}
}
}
- 如果您删除了项目,您不想增加
j
;它会让您跳过紧随其后的项目。 - 您不想在
1
开始第二个循环,您想在i+1
开始它,因为您不需要检查任何先前的元素。 - 您的示例有一些语法错误,您将
myList
更改为list
,并且缺少一些括号和一个分号
试试这个:
List<Hardware> list = new ArrayList<Hardware>();
list.add(new Hardware("Ram", 2));
list.add(new Hardware("Keyboard", 3));
list.add(new Hardware("Mouse", 5));
list.add(new Hardware("Keyboard", 5));
list.add(new Hardware("Mouse", 1));
for (int i = 0; i < list.size(); i++) {
Hardware current = list.get(i);
for (int j = i + 1; j < list.size(); j++) {
Hardware compare = list.get(j);
if (current.getName().equals(compare.getName())) {
current.setQuantity(current.getQuantity() + compare.getQuantity());
list.remove(compare);
j--;
}
}
}
您还应该查看此 link 以帮助您解决未来的此类问题:
注意你写了 O(n*n) 算法
它仅在 list.size()
较小时工作正常。您可能会在这里获得 O(n) 性能:
Map<String, Hardware> hardwareMap = new HashMap<>();
for(Hardware h : myList){
Hardware current = hardwareMap.get(h.getName());
if(current == null){
hardwareMap.put(h.getName(), h);
}else{
current.setQuantity(current.getQuantity() + h.getQuantity());
}
}
Collection<Hardware> list = hardwareMap.values();