我有一个列出谁付款的名字的列表,还有另一个列出每次付款的费用的列表。 例如:
我需要汇总每个人的费用。因此数组必须变为:
我已经完成了订购部分,但是我不知道如何将每人的每笔费用相加,然后删除重复的字符串/费用值。 这是我的代码:
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 + 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);
}
}
}
我无法对totals.put(name,total + price)行进行十进制求和; 我应该如何纠正代码?
答案 0 :(得分:2)
您可以使用Map
存储每个人的姓名和他们购买的商品总数来解决此问题。
Map<String, Integer> totals = new HashMap<>();
for (int i = 0; i < nameArray.size(); ++i) {
String name = nameArray.get(i);
int price = priceArray.get(i);
Integer total = totals.get(name);
if (total != null) {
totals.put(name, total + price);
} else {
totals.put(name, price);
}
}
这时,您有一个Map
,其中包含每个人的条目及其花费的总额。您可以为每个List
创建新的Map.Entry
,然后使用现有的排序代码。
List<String> uniqueNames = new ArrayList<>();
List<Integer> uniquePrices = new ArrayList<>();
for (Map.Entry<String, Integer> entry : totals.entrySet()) {
uniqueNames.add(entry.getKey());
uniquePrices.add(entry.getValue());
}
当然,您可以在通过entrySet()
构建列表时对列表进行排序,但是现在您应该也可以使用。
答案 1 :(得分:0)
您应该结合使用HashMap和List来存储所有值: 示例:
HashMap<String, List<Integer>> listNamesPrices = new HashMap<>();
List<Integer> nicolaPrices= new ArrayList<>();
nicolaPrices.add(24);
nicolaPrices.add(1);
listNamesPrices.put("Nicola", nicolaPrices);
int sum=0;
for (int i : prices){
sum += i;
}
// sum will be 25 (24 + 1) at end, after that You can make another HashMap of <String, int>
// and store <"name",sum> in it, e.g. Nicola,25
HashMap<String, Integer> listNameSum = new HashMap<>();
listNameSum.put("Nicola",sum);