Использование Hashmaps для сравнения ключей и значений и сложения значений на основе похожих ключей - PullRequest
0 голосов
/ 27 февраля 2019

Так что мне было интересно, как и если это возможно, используя Hashmaps, один из которых содержит только строки, а другой содержит аналогичный строковый ключ, но значение с плавающей запятой, чтобы сравнить их, а затем из этого сравнения вывести количество аналогичных значений впервый hashmap, а затем число с плавающей точкой из второго hashmap, добавленное вместе, когда их ключи / значения совпадают.Пример ниже, который должен прояснить, что я имею в виду и сделать это динамически.

КОД

HashMap<String, String> hmap = new HashMap<>();
HashMap<String, Float> h2map = new HashMap<>();
hmap.put("order1", "pending");
hmap.put("order2", "cancelled");
hmap.put("order3", "pending");

h2map.put("order1", (float) 19.95);
h2map.put("order2", (float) 19.95);
h2map.put("order3", (float) 39.9);

Set <String> singles = new HashSet<>(h2map.values());

if(h2map.keySet().equals(hmap.keySet())) {
// below prints out the states and amount of the states but how can i get the float values from hmap to be added together for the similar states and printed with their respective state?
  for(String element : singles) {               
   System.out.println(element + ": " + Collections.frequency(hmap.values(), element));          
                    }
}

Токовый выход

pending: 2
cancelled: 1

Желаемый выход

pending: 2 $59.85
cancelled 1 $19.95

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Я заменил использование Float на BigDecimal для большей точности.Также я использовал две карты, одну для хранения суммированного значения, а другую для подсчета:

public static void main(String[] args) {
        HashMap<String, String> hmap = new HashMap<>();
        HashMap<String, BigDecimal> h2map = new HashMap<>();
        hmap.put("order1", "pending");
        hmap.put("order2", "cancelled");
        hmap.put("order3", "pending");

        h2map.put("order1", new BigDecimal("19.95"));
        h2map.put("order2", new BigDecimal("19.95"));
        h2map.put("order3", new BigDecimal("39.9"));

        //Map for holding sum 
        HashMap<String, BigDecimal> sum = new HashMap<>();

        for(String key : h2map.keySet()){
            if(hmap.get(key) != null){
                String value = hmap.get(key);
                if(sum.get(value) == null){
                    sum.put(value, h2map.get(key));
                }else{
                    sum.put(value, (sum.get(value).add(h2map.get(key))));
                }
            }
        }
        //Map for holding count
        HashMap<String, BigDecimal> countMap = new HashMap<>();
        for(Iterator<Map.Entry<String, BigDecimal>> itr = sum.entrySet().iterator(); itr.hasNext(); ){
            Map.Entry<String, BigDecimal> entry = itr.next();
            String key = entry.getKey();
            int count = Collections.frequency(hmap.values(), key);
            countMap.put((key + count), sum.get(key));
            itr.remove();
        }
        //For GC
        sum = null;
        countMap.forEach((k, v) -> System.out.println(k + " " + v));
    }
0 голосов
/ 27 февраля 2019

Это то, что вы хотите?

public static void main(String[] args) {
    HashMap<String, String> hmap = new HashMap<>();
    HashMap<String, Float> h2map = new HashMap<>();

    hmap.put("order1", "pending");
    hmap.put("order2", "cancelled");
    hmap.put("order3", "pending");

    h2map.put("order1", 19.95f);
    h2map.put("order2", 19.95f);
    h2map.put("order3", 39.9f);

    Map<String, DoubleSummaryStatistics> grouping = hmap
            .entrySet()
            .stream()
            .collect(Collectors.groupingBy(Map.Entry::getValue, Collectors.summarizingDouble(e -> h2map.get(e.getKey()))));

    grouping.forEach((key, value) -> System.out.println(key + ": " + value.getCount() + " " + value.getSum()));
}

Обратите внимание, что для BigDecimal не существует сборщика итоговой статистики, и этот код работает только с Float или Double.Но для денежных расчетов лучше использовать BigDecimal.Возможно реализовать пользовательский коллектор при необходимости)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...