Получить сумму целых чисел внутри ArrayList под тем же именем String, используя Map - PullRequest
0 голосов
/ 31 мая 2018

У меня есть ArrayList с одним строковым значением и двумя целочисленными значениями.Я хочу, чтобы сумма целых чисел под тем же значением String.Например,

  • aaa , 1 , 2
  • aaa , 2 , 1
  • bbb , 1 , 2
  • ccc , 3 , 3
  • ccc , 1 , 2
  • ccc , 2 , 2

Таким образом, окончательный список должен иметь вид

  • aaa , 3, 3
  • bbb , 1, 2
  • ccc , 6, 7

Мне удалось получить сумму, используя одну строку и одно целое число.

это то, что я использовал для одной строки и одного целого числа.

ArrayList<InvoiceData> invoiceHeaderList = new ArrayList<>();
invoiceHeaderList.clear();
Map<String, Integer> sumMap = new TreeMap<String, Integer>();

for (ItemData dashboardOneData : invoiceList) {
    String key = dashboardOneData.getInvoiceNo() + "#" + dashboardOneData.getInvoiceDate();
    if (sumMap.containsKey(key)) {
        int sum = sumMap.get(key);
        sum += dashboardOneData.getMatQty();
        sumMap.put(key, sum);
    } else {
        sumMap.put(key, dashboardOneData.getMatQty());
    }
}

for (Map.Entry<String, Integer> e : sumMap.entrySet()) {
    String[] splitInvoice;
    InvoiceData invTempData = new InvoiceData();
    if (e.getKey() != null || !e.getKey().equals("")) {
        splitInvoice = e.getKey().split("#+");
        invTempData.setInvoiceNo(splitInvoice[0]);
        invTempData.setInvoiceDate(splitInvoice[1]);
        invTempData.setInvoiceQty(e.getValue());
        invoiceHeaderList.add(invTempData);
    }
}

Я попытался сделать, как показано ниже, но не повезло, я не смог взять сумму двух целых чисел внутри метода.

public class QuantityData {
    private int oriQty;
    private int newQty;

    public QuantityData() {
    }
}

Метод ....

ArrayList<InvoiceData> invoiceHeaderList = new ArrayList<>();
invoiceHeaderList.clear();
Map<String, List<QuantityData>> sumMap = new TreeMap<String, List<QuantityData>>();

for (ItemData dashboardOneData : invoiceList) {
    String key = dashboardOneData.getInvoiceNo() + "#" + dashboardOneData.getInvoiceDate();
    QuantityData qtyData = new QuantityData();
    if (sumMap.containsKey(key)) {
        ArrayList<QuantityData> qtyArrayList = new ArrayList<>();

        qtyArrayList.add(qtyData);
        sumMap.put(key, qtyArrayList);

    } else {
        ArrayList<QuantityData> qtyArrayList = new ArrayList<>();
        qtyData.setOriQty(dashboardOneData.getMatQty());
        qtyData.setNewQty(dashboardOneData.getNewMatQty());
        qtyArrayList.add(qtyData);
        sumMap.put(key, qtyArrayList);
    }
}

for (Map.Entry<String, List<QuantityData>> e : sumMap.entrySet()) {
    String[] splitInvoice;
    InvoiceData invTempData = new InvoiceData();
    if (e.getKey() != null || !e.getKey().equals("")) {

    }
}

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Я не совсем понимаю, как выглядит ваша структура входных данных, но я сделаю все возможное.

Допустим, у вас есть структура входных данных, которая выглядит примерно так:

@Data //using Lombok @Data annotation
class Data{
    String key;
    Integer[] values;
}

тогда вы можете сделать что-то вроде этого:

Map<String, Integer[]> getSummedDataByKey(List<Data> items){
    Map<String, Integer[]> summedData;
    for (Data d : items){
        if (!summedData.contains(d.getKey())){
            summedData.put(d.getKey(), d.getValues());
        }else{
            Integer[] oldValues = summedData.get(d.getKey());
            for (int i = 0; i < oldValues.length; i++){
                oldValues[i] += d.getValues()[i];
            }
            summedData.put(d.getKey(), oldvalues);
        }
    }
    return summedData;
}
0 голосов
/ 01 июня 2018

это то, что я понял.

 for (ItemData dashboardOneData : invoiceList) {
            String key = dashboardOneData.getInvoiceNo() + "#" + dashboardOneData.getInvoiceDate();
            QuantityData qtyData = new QuantityData();
            if (sumMap.containsKey(key)) {
                ArrayList<QuantityData> qtyArrayList = new ArrayList<>();
                List<QuantityData> bobs = sumMap.get(key);
                int sum1 = bobs.get(0).getOriQty();
                int sum2 = bobs.get(0).getNewQty();
                sum1 += dashboardOneData.getMatQty();
                sum2 += dashboardOneData.getNewMatQty();
                qtyData.setOriQty(sum1);
                qtyData.setNewQty(sum2);
                qtyArrayList.add(qtyData);
                sumMap.put(key, qtyArrayList);

            } else {
                ArrayList<QuantityData> qtyArrayList = new ArrayList<>();
                qtyData.setOriQty(dashboardOneData.getMatQty());
                qtyData.setNewQty(dashboardOneData.getNewMatQty());
                qtyArrayList.add(qtyData);
                sumMap.put(key, qtyArrayList);
            }
        }
0 голосов
/ 31 мая 2018

Если я правильно понял вашу цель, вам вообще не нужны списки массивов.

Вы пробовали что-то подобное?

Map<String, QuantityData> sumMap = new TreeMap<String, QuantityData>();
QuantityData qtyData;
for (ItemData dashboardOneData : invoiceList) {
    String key = dashboardOneData.getInvoiceNo() + "#" + dashboardOneData.getInvoiceDate();
    if (sumMap.containsKey(key)) {
        qtyData = sumMap.get(key)
        qtyData.setOriQty(qtyData.getOriQty() + dashboardOneData.getMatQty());
        qtyData.setNewQty(qtyData.getNewQty() + dashboardOneData.getNewQty());
    } else {
        qtyData = new QuantityData();
        qtyData.setOriQty(dashboardOneData.getMatQty());
        qtyData.setNewQty(dashboardOneData.getNewMatQty());
    }
    sumMap.put(key, qtyData);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...