我有一个ArrayList<项目>,我想做一个功能,用相同的代码汇总所有项目的数量,然后显示所有数量的项目。
public class Item{
private String code;
private int quantity;
public Item(String InputCode, int InputQuantity)
{
this.code= InputCode;
this.quantity = InputQuantity;
}
}
假设我执行以下操作
List<Item> items = new ArrayList<Item>();
items.add(new Item("A01", 1));
items.add(new Item("A02", 1));
items.add(new Item("B05", 2));
items.add(new Item("A01", 3));
items.add(new Item("Z02", 2));
items.add(new Item("A02", 2));
display();
然后所需的输出是
A01 4
A02 3
B05 2
Z02 2
我不知道,有人能给我一些提示吗?
答案 0 :(得分:10)
您可以使用流来执行此操作:
import static java.util.stream.Collectors.*;
...
Map<String, Integer> map = items.stream()
.collect(groupingBy(Item::getCode,
summingInt(Item::getQuantity)));
假设你的班级有这些吸气剂:
public class Item {
...
public String getCode() {...}
public int getQuantity() {...}
}
这会将商品代码A01
,A02
等映射到各自的数量总和。
您可以使用以下代码获取按代码排序的输出:
map.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.forEachOrdered((e) -> System.out.println(e.getKey() + " " + e.getValue()));
注意:改为使用.forEachOrdered(System.out::println)
生成类似A01=4
的输出,这与您给出的示例几乎相同,并且比上面的更简单。
答案 1 :(得分:1)
创建一个地图,其中string是代码,int是数量。如果是,则如果map包含键,则迭代项目列表检查,添加数量,否则添加新的键值对。
Map<String, Integer> map = new Hashmap<String, Integer>();
for(Item item : items){
if(map.containsKey(item.code)){
int q = map.get(item.code) + item.quantity;
map.put(item.code, q);
} else {
map.put(item.code, item.quantity);
}
}
答案 2 :(得分:1)
以下是使用Java 8 Stream API
和TreeMap
:
默认情况下,TreeMap
会根据可比较的自然顺序对其键进行排序。
必需的导入
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.summingInt;
import java.util.TreeMap;
示例代码
Map<String, Integer> result = items.stream()
.collect(groupingBy(Item::getCode, TreeMap::new, summingInt(Item::getQtd)));
result.forEach((k, v) -> System.out.println(k + " " + v));
输出
A01 4
A02 3
B05 2
Z02 2
答案 3 :(得分:0)
您可以尝试这样的事情
Map<String,Integer> countMap = new HashMap<>()
; Key
添加为地图,数量为Value
。 例如:
Map<String,Integer> countMap = new HashMap<>()
for(Item item: items){
Integer count=countMap.get(item.getCode())
// if null then add quantity and code
// eg: countMap.put(item.getCode(),item.getQuantity())
// if not null countMap.put(item.getCode(),count+item.getQuantity()
}
答案 4 :(得分:0)
检查流框架和esp。 Collectors类中的示例。 &#34;按部门计算工资总额&#34;可以很容易地解决你的问题。
答案 5 :(得分:0)
Map<String, Integer> maps = new HashMap<String, Integer>();
Item item;
for (int i = 0; i < items.size(); i++) {
item = items.get(i);
maps.put(item.getCode(), maps.containsKey(item.getCode()) ? item.getQuantity()+ + maps.get(item.getCode()) : item.getQuantity());
}
item = null;
//项目类
public class Item{
private String code;
private int quantity;
public Item(String InputCode, int InputQuantity)
{
this.code= InputCode;
this.quantity = InputQuantity;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
}
答案 6 :(得分:0)
只是来自java6中myside的解决方案。我在你的Item类中添加了getter和setter,并在itemcode的基础上实现了可比性。
希望它可以帮助你。修改后的物品类。
public class Item implements Comparable<Item> {
private String code;
private int quantity;
public Item(String InputCode, int InputQuantity) {
this.code = InputCode;
this.quantity = InputQuantity;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
@Override
public int compareTo(Item o) {
// TODO Auto-generated method stub
return this.getCode().compareTo(o.getCode());
}
}
获得所需列表的方法:
List<Item> getDesiredList(List<Item> itemList) {
List<Item> tempList = new ArrayList<Item>();
// sort list to maintain order
Collections.sort(itemList);
String itemCode = null;
int quantity = 0;
Item itemObj = null;
for (int i = 0; i < itemList.size(); i++) {
if (itemCode == null || itemCode.equals(itemList.get(i).getCode())) {
quantity = quantity + itemList.get(i).getQuantity();
} else {
itemObj = new Item(itemCode, quantity);
if (tempList.contains(itemObj)) {
tempList.remove(itemObj);
}
tempList.add(itemObj);
quantity = 0;
quantity = quantity + itemList.get(i).getQuantity();
}
itemCode = itemList.get(i).getCode();
if (i == itemList.size() - 1) {
itemObj = new Item(itemCode, quantity);
tempList.add(itemObj);
}
}
return tempList;
}
希望它可以帮到你。