Удалите повторяющиеся элементы из arrayylist и hashmap

У меня есть аррайлист с именем того, кто что-то платит, и еще один аррайлист с указанием стоимости каждого платежа. Например:

  • nameArray = Никола, Рауль, Лоренцо, Рауль, Рауль, Лоренцо, Никола
  • priceArray = 24, 12, 22, 18, 5, 8, 1

Мне нужно подсчитать стоимость каждого человека. Итак, массив должен стать:

  • nameArray = Никола, Рауль, Лоренцо

  • Массив цен = 25, 35, 30

    А затем, упорядочивая массив по цене, так:

  • nameArray = Рауль, Лоренцо, Никола

  • priceArray = 35, 30, 25

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

public void bubble_sort(ArrayList<String> nameArray, ArrayList<BigDecimal> priceArray) {
    Map<String, BigDecimal> totals = new HashMap<>();

    for (int i = 0; i < nameArray.size(); ++i) {
        String name = nameArray.get(i);
        BigDecimal price = priceArray.get(i);

        BigDecimal total = totals.get(name);

        if (total != null) {
            totals.put(name, total.add(price));
        } else {
            totals.put(name, price);
        }
    }
    for (Map.Entry<String, BigDecimal> entry : totals.entrySet()) {
        nameArray.add(entry.getKey());
        priceArray.add(entry.getValue());
    }

    for (int i = 0; i < priceArray.size(); i++) {
        for (int j = 0; j < priceArray.size() - 1; j++) {
            if (priceArray.get(j).compareTo(priceArray.get(j + 1)) < 0) {
                BigDecimal tempPrice = priceArray.get(j);
                String tempName = nameArray.get(j);
                priceArray.set(j, priceArray.get(j + 1));
                nameArray.set(j, nameArray.get(j + 1));
                priceArray.set(j + 1, tempPrice);
                nameArray.set(j + 1, tempName);
            }

        }

    }
    Log.v("New nameArray", nameArray.toString());
    Log.v("New priceArray", priceArray.toString());

}

Это результат журнала:

New nameArray: [Nico, Nico, Raul, Nico, Raul, Lorenzo, Lorenzo, Raul]
New priceArray: [43.50, 25.50, 18.98, 18.00, 16.98, 9.50, 9.50, 2.00]

Нико заплатил 18,00 + 25,50 = 43,50, Рауль 16,98 +2 = 18,98 и Лоренцо 9,50. Имя и цена были вставлены пользователем динамически.

Мне нужно отобразить массив следующим образом:

  • nameArray: Нико, Рауль, Лоренцо
  • priceArray: 43.50, 16.98, 9.50

Set <String> set = new LinkedHashSet <> (nameArray); или просто возьмите nameArray как Set, установите автоматическое удаление повторяющихся значений

kuber singh 10.12.2018 14:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
580
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы добавляете записи Map к исходным List. Вы должны сначала очистить их:

nameArray.clear();
priceArray.clear();
for (Map.Entry<String, BigDecimal> entry : totals.entrySet()) {
    nameArray.add(entry.getKey());
    priceArray.add(entry.getValue());
}

Или, если вы не хотите перезаписывать оригинальные List, вам следует создать новые ArrayList.

Спасибо, чувак, я уже решил это с помощью этого кода: while (contLoop <nameArray.size ()) {for (int j = contLoop; j <nameArray.size () - 1; j ++) {if (nameArray.get (contLoop ) .equals (nameArray.get (j + 1))) {nameArray.remove (j + 1); priceArray.remove (j + 1); }} contLoop ++; } которые удаляют дубликаты каждого массива, но с вашим кодом, очищающим массив, это проще, и я пишу меньше кода! Еще раз спасибо, чувак!

Nicola 10.12.2018 14:36

Самый простой способ - реализовать Set<String> как LinkedHashSet<String>(), чтобы сохранить порядок вставки. Это обеспечит уникальность вашего набора.

Наборы проверяют hashCode() и прилагаемый equals(). Предметы считаются равными, если их hashCode() одинаковы.

Если вы реализуете свой собственный класс, вы можете переопределить hashCode() и equals(), чтобы также проверить уникальность.

Другие вопросы по теме