Удалить дубликаты элементов из массива и hashmap - PullRequest
0 голосов
/ 10 декабря 2018

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

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

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

  • nameArray = Никола, Рауль, Лоренцо
  • цена Array = 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

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

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

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

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

0 голосов
/ 10 декабря 2018

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

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

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

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