繁体   English   中英

使用HashMap使用同一键更新多个值的问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM