【问题标题】:Speeding up nested for loop that utilizes 2 large arraylists加速利用 2 个大型数组列表的嵌套 for 循环
【发布时间】:2017-03-17 17:11:54
【问题描述】:

有 2 个对象数组列表,其中第二个对象有一个相关字段,我想用它填充第一个对象。

public ArrayList<object1> updateAccountWithGSAM(ArrayList<object1> o1, ArrayList<object2> o2) {
    ArrayList<object1> accs = new ArrayList<object1>();

    for (object1 acc : o1) {
        ArrayList<String> o2s= new ArrayList<String>();
        for (object2 g : o2) {
            if (g.getfield() != null) {
                if (acc.getId().equals(g.getobject1())) {
                    o2s.add(g.getCode());
                }
            }

        }
        acc.setGSAM_code(o2s);
        accs.add(acc);
    }


    return accs;

}

通常,当数据较小时,这可以正常工作,但是当数据集变大时(obj1 和 2 在 prod 中每个大小约为 500,000)会遇到问题。

不确定我可以做哪些优化来加快速度,或者是否有替代嵌套 for 循环的方法来完成我想要完成的任务?

【问题讨论】:

  • 你使用的是什么版本的java?如果是 Java 8,请尝试流
  • 您可以将该数据放入两个地图中,使用该 ID 作为键。为您节省 n 次 2 循环。
  • 我在使用 java 8。但对流 pons 不太熟悉,这是在 2 个列表之间进行过滤的有效选项吗?
  • 我很高兴我的意见让您编写自己的工作解决方案。如果您发现我的意见有帮助,我不介意您支持我的另一个答案。 :-)

标签: java for-loop arraylist


【解决方案1】:

我还没有编译代码,但是这样的东西应该可以工作:

public ArrayList<object1> updateAccountWithGSAM(ArrayList<object1> o1, ArrayList<object2> o2) {
   HashMap<String, ArrayList<String>> reverseMap = new HashMap<String, ArrayList<String>>()
    for (object2 g : o2) {
        if (g.getfield() != null) {
            ArrayList<String> accs1 = reverseMap.get(g.getobject1());
            if(accs1 == null) {
                accs1 = new ArrayList<String>()
                reverseMap.put(g.getobject1(), acc1)
            }
            accs1.add(o2s);
        }
    }
    ArrayList<object1> accs = new ArrayList<object1>();
    for (object1 acc : o1) {
        ArrayList<String> o2s= new ArrayList<String>();
        if(reverseMap.get(acc.getCode()) != null) {
            acc.setGSAM_code(o2s);
            accs.add(acc);
        }
    }

    return accs;
}

【讨论】:

  • 这也是我第一次尝试优化(尺寸可能会开始使其他地图类型更具吸引力)。它减少了对 o1 中的每个项目进行一次昂贵的搜索 o2 的需要。
  • 哈哈,根据 ghostcat 的建议,我最终写出了几乎完全一样的东西。像魅力一样工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
相关资源
最近更新 更多