[英]Issue with updating multiple values with the same key using HashMap
我遇到一个问题,其中一个键/值对正确更新,但是具有相同键的其他值未更新。 我正在使用一个HashMap,它由一个字符串列表(项Nbr)作为键和存储为字符串列表(PO Nbr)的值组成,因此从本质上讲,它是一对多的。 下面是实现该HashMap的代码,但我只是被卡住了。 任何帮助,将不胜感激。
public void process(List<PoBean> excelData,List<String> errors) throws CustomException
{
Map<String,ArrayList<String>> poNbrItemNbrMap = new HashMap<String, ArrayList<String>>();
ArrayList<String> poNbrList = new ArrayList<String>();
int recordCount = excelData.size();
for(PoBean bean : excelData)
{
if(rowValidator.validate(bean, errors))
{
if (!newErrorInRow(errors))
{
poNbrList.add(bean.getPoId());
poNbrItemNbrMap.put(bean.getItemNbr(),bean.getPoId());
}
}
}
List<DutyFees> dutyFeesTempDAO = myService.getAssocIdByPOAndItemNbr(new ArrayList<String>(poNbrItemNbrMap.keySet()),new ArrayList<String>(poNbrItemNbrMap.values()));
for(DutyFees duty : dutyFeesTempDAO)
{
Double dutyFees = new Double(0);
if(poNbrItemNbrMap.containsKey(duty.getItemNbr()) && poNbrItemNbrMap.containsValue(duty.getPoId()))
{
for(PoBean dutyBean : excelData)
{
if(duty.getPoId().equals(dutyBean.getPoId()) && duty.getItemNbr().equals(dutyBean.getItemNbr()))
{
dutyFees = new Double(dutyBean.getDutyFees());
break;
}
}
Boolean result = myService.updateDutyFeesByAssocID(duty.getAssocId(), dutyFees);
}
}
}
您说想要一对多,但代码却一对一
HashMap<String,String> poNbrItemNbrMap = new HashMap<String,String>();
一个字符串键到一个字符串值
斜体部分与问题中的粗体部分相反。
我正在使用一个HashMap,它由一个字符串列表(项Nbr)作为键和存储为字符串列表(PO Nbr)的值组成, 因此从本质 上讲, 它是一对多的。
斜体字意味着很多。 粗体表示一对多。
无论如何,让我给你们两个实现一起玩。
public class Test {
public static void main(String[] args) {
System.out.println("= One to Many =");
Map<String, List<String>> stringListMap = new HashMap<>();
String key = "list of 4 strings";
List<String> valuesList = Arrays.asList("one","two","three","four");
stringListMap.put(key,valuesList);
stringListMap.forEach((strings, strings2) -> System.out.println(strings.toString() + strings2.toString()));
System.out.println("= Many to Many =");
Map<List<String>, List<String>> listListMap = new HashMap<>();
List<String> keys = Arrays.asList("1","2","3","4");
List<String> values = Arrays.asList("one","two","three","four");
listListMap.put(keys,values);
listListMap.forEach((strings, strings2) -> System.out.println(strings.toString() + strings2.toString()));
}
}
编辑对您评论的回复。 不确定您在该评论中的意思,但我确实看到了几个问题。 首先,当您放置地图时,您放置的是物品编号和Poid,因此它们似乎都是单一String类型,而不是ArrayList类型。 因此,我什至不确定您如何编译它。 除非您的getPoId实际上是getPoIds并返回一个列表。 我说的是这条线
poNbrItemNbrMap.put(bean.getItemNbr(),bean.getPoId());
现在关于
new ArrayList<String>(poNbrItemNbrMap.values())
您不能像这样初始化数组列表。
我不知道getAssocIdByPoAndItemNbr函数的签名是什么,因此无法建议答案。 但是,如果您只想发送映射值,然后直接发送它,为什么将它作为新ArrayList <>()的构造函数参数放入?
process
的第一部分的目的很明确:将PoBean
对象列表转换为Map<String, List<String>>
,然后按itemNbr
将对象分组为列表。 这是执行此操作的代码:
// One-to-many relationship requires the value to be a List
// Better not say ArrayList here because then you put unnecessary
// Restrictions on the code.
Map<String, List<String>> poNbrItemNbrMap = new HashMap<>();
for(PoBean bean : excelData)
{
if(rowValidator.validate(bean, errors))
{
if (!newErrorInRow(errors))
{
String key = bean.getItemNbr();
List<String> value = poNbrItemNbrMap.get(key);
if (value == null) {
// This is first time we see this item nbr,
// Create a new list to hold the values
value = new ArrayList<>();
poNbrItemNbrMap.put(key, value);
}
// Just add the value to the list
value.add(bean.getPoId());
}
}
}
现在第二部分令人困惑,尤其是这一行:
List<DutyFees> dutyFeesTempDAO = myService.getAssocIdByPOAndItemNbr(new ArrayList<String>(poNbrItemNbrMap.keySet()),new ArrayList<String>(poNbrItemNbrMap.values()));
第一个参数几乎没有意义,它以List
的形式传递键; 没关系。 第二个参数无法编译,因为您需要new ArrayList<List<String>>(poNbrItemNbrMap.values())
。 是的,您需要一个字符串列表列表。 但这仅仅是开始。 通过这样做,您基本上删除了键和值之间的关系, getAssocIdByPOAndItemNbr
方法无法getAssocIdByPOAndItemNbr
键及其各自的值关联起来。 它不能假定键中的第一项映射到值中的第一项。 这意味着我们在第一部分所做的任何事情都是无用的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.