我有一个列出谁付款的名字的列表,还有另一个列出每次付款的费用的列表。例如:
我需要汇总每个人的费用。因此数组必须变为:
价格数组= 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]
尼科(Nico)支付18.00 + 25.50 = 43.50,劳尔16.98 +2 = 18.98和劳伦佐9.50。
名称和价格由用户动态插入。
我需要这样显示数组:
答案 0 :(得分: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
。
答案 1 :(得分:0)
最简单的方法是将Set<String>
实现为LinkedHashSet<String>()
,以保留插入顺序。这样可以确保您的集合具有唯一性。
设置检查hashCode()
和随附的equals()
。如果项目hashCode()
是相同的,则它们被认为是相等的。
如果实现自己的类,则可以覆盖hashCode()
和equals()
来检查其唯一性。