Java метод подсчета для повторяющегося элемента в списке массива - PullRequest
0 голосов
/ 07 мая 2020

скажем, у меня есть массив List типа Order Details

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

, а поля в orderDetails:

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

мой arrayList содержит значения`

A012    69
A012    36

Мне нужно изменить вывод списка, чтобы при добавлении чего-то в список того же productCode выручка складывалась вместе

, поэтому результат приведенного выше примера будет

A012   105

как будет работать метод

Ответы [ 3 ]

1 голос
/ 07 мая 2020

Это должно работать, если у вас есть соответствующий getters для класса. Он просто создает поток OrderDetails объектов, отфильтровывает нулевые коды продуктов и создает карту сумм доходов.

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"));
0 голосов
/ 07 мая 2020

Вы можете использовать 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 );
        }
    }
0 голосов
/ 07 мая 2020

Небольшой фрагмент кода с использованием карты, как показано ниже, может быть полезным:

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;
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...