为了账号安全,请及时绑定邮箱和手机立即绑定

是否有任何最佳方法可以在 2 arrayList 中找到不同的值

是否有任何最佳方法可以在 2 arrayList 中找到不同的值

茅侃侃 2022-10-12 15:26:26
我正在尝试找到一种最佳方法来在其中包含映射的 2 个 arrayLists 中找到不同的元素。前任。a1 和 a2 是数组列表,其中a1 = [{"val":"1","id":"19"},{"val":"2","id":"22"},{"val":"3","id ":"2"},{"val":"4","id":"49"}]a2 = [{"val":"1","id":"12"},{"val":"2","id":"22"},{"val":"3","id ":"32"},{"val":"5","id":"52"}]预期输出为:lOld = [{"val":"5","id":"52"}]lNew = [{"val":"4","id":"49"}]我对这个问题的解决方案是:List<Map<String, String>> lOld = new ArrayList<Map<String,String>>();for (int i = 0; i < a2.size(); i++) {    boolean found = false;    for (int j = 0; j < a1.size(); j++) {        if(a2.get(i).get("val").equals(a1.get(j).get("val"))){            found = true;            break;        }    }    if(found == false){        lOld.add(a2.get(i));    }}List<Map<String, String>> lNew = new ArrayList<Map<String,String>>();for (int i = 0; i < a1.size(); i++) {    boolean found = false;    for (int j = 0; j < a2.size(); j++) {        if(a1.get(i).get("val").equals(a2.get(j).get("val"))){            found = true;            break;        }    }    if(found == false){        lNew.add(a1.get(i));    }}有没有解决这个问题的最佳方法?注意:arrayList 中的映射包含多个值。a1 和 a2 仅作为示例。
查看完整描述

3 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

  • 将 ArrayList 转换为 HashSet

    • 这为 set.contains() 提供了 O(1)

  • 使用 Map.equals() 检查 2 个映射是否具有相同的键值对(即检查内容是否相同)

现在您可以遍历一个集合并检查该元素是否存在于另一个集合中。这将为您提供线性时间而不是二次


查看完整回答
反对 回复 2022-10-12
?
偶然的你

TA贡献1841条经验 获得超3个赞

解决此问题的步骤:

  1. 将arrayList a1中的映射合并到映射lOld,将arrayList a2中的映射合并到映射lNew

  2. 从 lOld Map 和 lNew Map 中获取 keySet

  3. 将两个键集中的公共键添加到临时数组列表中

  4. 从两个 keySet 中删除这个临时 arrayList。

  5. 如果要以 arrayList 形式输出,请将 lOld 和 lNew 映射添加到新创建的 arrayLists

Ideone 上的演示

     // start- get arrayList a1 index entries, fetch map,put all maps into one map to 

        //remove duplicate keys,doesn't matter value- because they will be removed anyways)

        Map<String, String> lOld = new HashMap<String, String>();

        for (i = 0; i < a1.size(); i++) {

            HashMap<String, String> a1Map = a1.get(i);

            lOld.putAll(a1Map);

        }

        //end


        // start- get arrayList a2 index entries, fetch map,put all maps into other map to remove

        // duplicate keys,doesn't matter value- because they will be removed anyways)


        HashMap<String, String> lNew = new HashMap<String, String>();

        for (j = 0; j < a2.size(); j++) {

            HashMap<String, String> a2Map = a2.get(j);

            lNew.putAll(a2Map);

        }

       //end


        // check if first map keys (set) is in second map keys (set). 

       //if yes, add them into a list.

        List<String> toRemove = new ArrayList<>();

        Set<String> oldKeys = lOld.keySet();

        Set<String> newKeys = lNew.keySet();

        for (String oldKey : oldKeys) {

            if (lNew.containsKey(oldKey)) {

                toRemove.add(oldKey);

            }

        }


        // remove that list elements from both sets which will remove them from map itself.

        oldKeys.removeAll(toRemove);

        newKeys.removeAll(toRemove);


        // print both map

        System.out.println("lold map is: " + lOld);

        System.out.println("lNew map is: " + lNew);


        // don't remove elements from set while iterating. it will give ConcurrentModificationException



查看完整回答
反对 回复 2022-10-12
?
慕容708150

TA贡献1831条经验 获得超4个赞

在集合中查找项目的最佳性能是使用 HashSet。

在这里查看: https ://www.baeldung.com/java-hashset-arraylist-contains-performance


查看完整回答
反对 回复 2022-10-12
  • 3 回答
  • 0 关注
  • 99 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信