数组List中重复元素的Java计数方法



假设我有一个类型为Order Details 的数组列表

private static List<OrderDetails> orderDetails = new ArrayList<OrderDetails>();

orderDetails中的字段为

private String productCode = null;
private int revenue = 0;

my arrayList包含值`

A012    69
A012    36

我需要更改列表的输出,这样,如果有东西添加到同一产品的列表中代码,收入就会加在一起

所以上面例子的输出是

A012   105

的方法如何工作

假设您拥有适用于该类的getters,那么这应该会起作用。它只是创建一个OrderDetails对象流,过滤掉空的productCodes,并创建收入总和的映射。

Map<String,Integer> results =  orderDetails.stream()
.filter(od->od.getProductCode() != null)
.collect(Collectors.groupingBy(OrderDetails::getProductCode,
Collectors.summingInt(OrderDetails::getRevenue)));

如果需要,可以通过创建每个OrderDetails类的新实例将值返回到列表中。

orderDetails = results.entrySet().stream()
.map(e->new OrderDetails(e.getKey(), e.getValue()))
.collect(Collectors.toList());

使用地图可能更有用,因为你可以获得任何产品代码的收入。

例如

System.out.println(results.get("A012"));

使用以下Map的小代码片段可能会有所帮助:

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Test {
private static List<OrderDetails> orderDetails = new ArrayList<OrderDetails>();
public static void main(String[] args) {
final OrderDetails o1 = new OrderDetails("A12", 69);
final OrderDetails o2 = new OrderDetails("A12", 36);
final OrderDetails o3 = new OrderDetails("A13", 136);
addToList(o1);
addToList(o2);
addToList(o3);
orderDetails.stream().map(orderDetail -> orderDetail.getProductCode() + " " + orderDetail.getRevenue()).forEach(System.out::println);
}
private static synchronized void addToList(OrderDetails orderDet) {
final Map<String, OrderDetails> map = orderDetails.stream().collect(Collectors.toMap(OrderDetails::getProductCode, orderDetail -> orderDetail, (a, b) -> b));
final OrderDetails objectFromMap = map.get(orderDet.getProductCode());
if (objectFromMap != null) {
objectFromMap.setRevenue(objectFromMap.getRevenue() + orderDet.getRevenue());
} else {
map.put(orderDet.getProductCode(), orderDet);
}
orderDetails.clear();
orderDetails.addAll(map.values());
}
}
class OrderDetails {
private String productCode = null;
private int revenue = 0;
public OrderDetails(String productCode, int revenue) {
this.productCode = productCode;
this.revenue = revenue;
}
public String getProductCode() {
return productCode;
}
public int getRevenue() {
return revenue;
}
public void setRevenue(int revenue) {
this.revenue = revenue;
}
}

您可以使用这样的Map

Map<String, Integer> orderDetails = new new HashMap<>();

并使用此方法添加新订单:

void addOrder(Order orderToAdd) {
Order findOrder = orderDetails.get(orderToAdd.productCode);
if (findOrder != null) {
findOrder.revenue += orderToAdd.revenue ;
} else {
orderDetails.put(orderToAdd.productCode, orderToAdd.revenue );
}
}

最新更新