【问题标题】:How to compare maps and store the result into Value Objects using Java?如何使用 Java 比较地图并将结果存储到值对象中?
【发布时间】:2013-09-05 17:50:42
【问题描述】:

我正在尝试处理 3 个哈希图并将它们的数据放入值对象列表中。但是,我的代码在某处失败时遇到了问题。

这是我想要完成的场景:

Map1 是源地图,map2 和 map3 用于与 map1 进行比较。最后,我将结果存储到 VO(值对象)中。

    HashMap<Integer, BigDecimal> map1=new HashMap<Integer, BigDecimal>();

    map1.put(1,10)
    map1.put(2,20)
    map1.put(3,30)
    map1.put(4,40)
    map1.put(5,50)

    Map<Integer,String> map2=new HashMap<Integer,String>();


    map2.put(1,"Y");
    map2.put(2,"N");

   Map<Integer,String> map3=new HashMap<Integer,String>();

   map3.put(3,"N");
   map3.put(4,"N");
   map3.put(5,"N");


public Map<Integer, BigDecimal> process(
            final Map<Integer, BigDecimal> map1,
            final Map<Integer, String> map, final List<EmployeeVO> empDetails) {

        final Iterator<Integer> keys = map1.keySet().iterator();
        while (keys.hasNext()) {
            final EmployeeVO empVO = new EmployeeVO();
            final Integer empKeys = keys.next();
            empVO.setEmpId(empKeys);
            empVO.setEmpAmount(map1.get(empKeys));

            if (("Y".equals(map.get(empKeys)))) {

                empVO.setInd("Y");
                keys.remove();

            } else
                empVO.setInd("N");
            empDetails.add(empVO);
        }

        return map1;
    }

员工语音:

    public class EmployeeVO{

    private BigDecimal empAmount=new BigDecimal(0);
    private Integer empId;
    private String ind;

   //setters and getters

   }

我正在调用上面的方法,如下所示,令人惊讶的是,我的列表对象中有 10 条记录。你能告诉我如何解决这个问题。

    final List<EmployeeVO> empDetails = new CopyOnWriteArrayList<EmployeeVO>();

    final Map<Integer, BigDecimal> result1 = process(map1, map2, empDetails );
   final Map<Integer, BigDecimal> result2 = process(map1, map3, empDetails );

预期结果:列表应包含 5 个 VO 对象,但有 9 个记录

【问题讨论】:

  • 我们知道您的代码在某处出现故障,但我们看不到您的代码。发布它/
  • 您需要发布代码以便我们为您提供帮助!
  • 抱歉,已发布代码
  • 启动一个调试器,在empDetails.add() 上断点,向后工作,看看为什么该方法被调用了太多次。

标签: java


【解决方案1】:

我认为问题出在这里:

if (("Y".equals(map.get(empKeys))))

因为您的地图是原始地图,而不是通用类型(它的值不是字符串)。您已将此地图定义为:

HashMap map2=new HashMap();
HashMap map3=new HashMap();

试试吧:

Map<Integer, String> map2 = new HashMap<Integer, String>();
Map<Integer, String> map3 = new HashMap<Integer, String>();

您还需要制作empDetails 的地图:

final Map<Integer, EmployeeVO> empDetails = new HashMap<Integer, EmployeeVO>();

并有process 方法为:

void process(final Map<Integer, Integer> map1,
        final Map<Integer, String> map, final Map<Integer, EmployeeVO> empDetails) {

    final Iterator<Integer> keys = map1.keySet().iterator();
    while (keys.hasNext()) {
        EmployeeVO empVO = new EmployeeVO();
        Integer empId = keys.next();
        empVOsetEmpId(empId);
        empVO.setEmpAmount(map1.get(empId));

        if (("Y".equals(map.get(empId))))
            empVO setInd("Y");
        else
            empVO setInd("N");
        empDetails.put(empId, empVO);
    }
}

【讨论】:

  • 好的,那么请使用更新的代码编辑您的问题,以便我进行调查。
  • 它给出完全相同的结果,没有变化
  • 我明白这一点,但除非我看到你的最新代码,否则我无法调查它。
  • process 方法中你仍然有final Map&lt;?, ?&gt; map。那应该改为:final Map&lt;Integer, String&gt; map
  • 第一次调用 process 后:empDetails 将包含 5 个元素。在第二次调用process 后:empDetails 将包含 9 个元素。如果您在process 中看到代码,这也很明显,因为 map1 中的第一个元素被删除了,因为map2.get(1).equals("Y") 为真。
猜你喜欢
  • 2019-03-16
  • 1970-01-01
  • 2019-06-14
  • 2019-02-01
  • 1970-01-01
  • 2018-03-23
  • 2020-01-15
  • 1970-01-01
  • 2010-11-09
相关资源
最近更新 更多