android - 使用 Map 获取具有相同字符串名称的 ArrayList 内的整数总和
问题描述
我有一个带有一个字符串值和两个整数值的 ArrayList。我想要相同字符串值下的整数总和。例如
aaa , 1 , 2
aaa , 2 , 1
bbb , 1 , 2
ccc , 3 , 3
ccc , 1 , 2
ccc , 2 , 2
所以最终名单应该是
aaa , 3, 3
bbb , 1, 2
ccc , 6, 7
我能够使用一个字符串和一个整数得到总和。
这是我用于一个字符串和一个整数的。
ArrayList<InvoiceData> invoiceHeaderList = new ArrayList<>();
invoiceHeaderList.clear();
Map<String, Integer> sumMap = new TreeMap<String, Integer>();
for (ItemData dashboardOneData : invoiceList) {
String key = dashboardOneData.getInvoiceNo() + "#" + dashboardOneData.getInvoiceDate();
if (sumMap.containsKey(key)) {
int sum = sumMap.get(key);
sum += dashboardOneData.getMatQty();
sumMap.put(key, sum);
} else {
sumMap.put(key, dashboardOneData.getMatQty());
}
}
for (Map.Entry<String, Integer> e : sumMap.entrySet()) {
String[] splitInvoice;
InvoiceData invTempData = new InvoiceData();
if (e.getKey() != null || !e.getKey().equals("")) {
splitInvoice = e.getKey().split("#+");
invTempData.setInvoiceNo(splitInvoice[0]);
invTempData.setInvoiceDate(splitInvoice[1]);
invTempData.setInvoiceQty(e.getValue());
invoiceHeaderList.add(invTempData);
}
}
我尝试如下做,但没有运气,我无法在方法中取两个整数的总和。
public class QuantityData {
private int oriQty;
private int newQty;
public QuantityData() {
}
}
方法....
ArrayList<InvoiceData> invoiceHeaderList = new ArrayList<>();
invoiceHeaderList.clear();
Map<String, List<QuantityData>> sumMap = new TreeMap<String, List<QuantityData>>();
for (ItemData dashboardOneData : invoiceList) {
String key = dashboardOneData.getInvoiceNo() + "#" + dashboardOneData.getInvoiceDate();
QuantityData qtyData = new QuantityData();
if (sumMap.containsKey(key)) {
ArrayList<QuantityData> qtyArrayList = new ArrayList<>();
qtyArrayList.add(qtyData);
sumMap.put(key, qtyArrayList);
} else {
ArrayList<QuantityData> qtyArrayList = new ArrayList<>();
qtyData.setOriQty(dashboardOneData.getMatQty());
qtyData.setNewQty(dashboardOneData.getNewMatQty());
qtyArrayList.add(qtyData);
sumMap.put(key, qtyArrayList);
}
}
for (Map.Entry<String, List<QuantityData>> e : sumMap.entrySet()) {
String[] splitInvoice;
InvoiceData invTempData = new InvoiceData();
if (e.getKey() != null || !e.getKey().equals("")) {
}
}
解决方案
如果我正确理解了您的目标,那么您根本不需要 ArrayLists。
你有没有尝试过这样的事情?
Map<String, QuantityData> sumMap = new TreeMap<String, QuantityData>();
QuantityData qtyData;
for (ItemData dashboardOneData : invoiceList) {
String key = dashboardOneData.getInvoiceNo() + "#" + dashboardOneData.getInvoiceDate();
if (sumMap.containsKey(key)) {
qtyData = sumMap.get(key)
qtyData.setOriQty(qtyData.getOriQty() + dashboardOneData.getMatQty());
qtyData.setNewQty(qtyData.getNewQty() + dashboardOneData.getNewQty());
} else {
qtyData = new QuantityData();
qtyData.setOriQty(dashboardOneData.getMatQty());
qtyData.setNewQty(dashboardOneData.getNewMatQty());
}
sumMap.put(key, qtyData);
}
推荐阅读
- java - 相同的查询在 SQL Server 客户端和 JDBC 客户端提供不同的结果
- amazon-web-services - 禁用自动重新连接
- flutter - 键盘打开时如何解决 Flutter“A RenderFlex 溢出...”问题
- python - 如何显示我的模型中预定义的下拉字段?
- gis - Сan't get tiles using mapbox from geoserver
- javascript - jQuery AJAX $_POST 为空
- docker - Github Action CI/CD 到 EKS 和 ECR
- node.js - 我们是否需要 10 个不同的端口来运行 10 个客户端
- azure-queues - 尝试使用 Web api 从 Azure 队列中检索消息文本,但消息文本已编码。我如何删除编码
- java - Android 移除密码上的阴影 Toggle