У меня есть аррайлист с именем того, кто что-то платит, и еще один аррайлист с указанием стоимости каждого платежа. Например:
Мне нужно подсчитать стоимость каждого человека. Итак, массив должен стать:
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. Имя и цена были вставлены пользователем динамически.
Мне нужно отобразить массив следующим образом:




Вы добавляете записи 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 ++; } которые удаляют дубликаты каждого массива, но с вашим кодом, очищающим массив, это проще, и я пишу меньше кода! Еще раз спасибо, чувак!
Самый простой способ - реализовать Set<String> как LinkedHashSet<String>(), чтобы сохранить порядок вставки. Это обеспечит уникальность вашего набора.
Наборы проверяют hashCode() и прилагаемый equals(). Предметы считаются равными, если их hashCode() одинаковы.
Если вы реализуете свой собственный класс, вы можете переопределить hashCode() и equals(), чтобы также проверить уникальность.
Set <String> set = new LinkedHashSet <> (nameArray); или просто возьмите nameArray как Set, установите автоматическое удаление повторяющихся значений