繁体   English   中英

如果 map 包含键值上的匹配元素,如何迭代 Map 的字符串列表并添加到另一个列表?

[英]How to iterate over a list of Map of Strings and add to another list if map contains matching elements on a key value?

我有一个 Map<String, String> 列表,我想遍历它并找到字符串 map 中的公共元素并添加到另一个 map。

我很困惑 if 循环中的 go 应该是什么来获得我预期的 output。我正在寻找比较器类型调用,但我无法在任何地方找到它。

      for (int i = 0; i < list.size() - 1; i++) {
       if (list.get(i).get("Journal ID").equals(list.get(i+1).get("Journal ID")))
            // ???
         }
      }

我正在使用这种方法对地图列表进行排序。 我期待这样的事情

public Comparator<Map<String, String>> mapComparator = new Comparator<>() {
public int compare(Map<String, String> m1, Map<String, String> m2) {
    return m1.get("Journal ID").compareTo(m2.get("Journal ID"));
    }
       }

     Collections.sort(list, mapComparator);

// 输入和预期的 output my List = [{Journal ID=123, featureID=312},{Journal ID=123, featureID=313},{Journal ID=134, featureID=314},{Journal ID=123, featureID=1255}] 预计 output 是与“期刊 ID”匹配的 [{Journal ID=123, featureID=312}, { Journal ID=123, featureID=313},{Journal ID=123, featureID=1255}] .

一种方法是构建第二个 map,它将聚合所有地图。 它将反映所有地图中的所有键。 作为值将是带有计数器的每个键值的列表。 实施也可以加强,但主要方面是如何进行。 拥有聚合 map,然后可以直接转换为任何需要的结构。

public class TestEqMap {

    public static void main(String[] args) 
    {
        Map<String, String> m1 = Map.of("a","a1","b","b1");
        Map<String, String> m2 = Map.of("a","a1","b","b2");
        Map<String, String> m3 = Map.of("a","a2","b","b2");
        Map<String, String> m4 = Map.of("a","a1","b","b2");
        Map<String, String> m5 = Map.of("a","a3","b","b2");
        AggMap amap = new AggMap();
        amap.addMap(m1);
        amap.addMap(m2);
        amap.addMap(m3);
        amap.addMap(m4);
        amap.addMap(m5);
    
        amap.map.forEach((k,v)->System.out.println("key="+k+"\n"+v));
    }
    static class AggMap
    {
        public Map<String, ListItem> map = new HashMap<String,ListItem>();
        public void addMap(Map<String,String> m)
        {
            for(String key: m.keySet())
            {
                if(this.map.containsKey(key))
                {
                    this.map.get(key).addItem(m.get(key));
                }
                else
                {
                    ListItem li = new ListItem();
                    li.addItem(m.get(key));
                    this.map.put(key, li);
                }
            }
        }
        
    }
    static class ListItem
    {
        public List<Item> li = new ArrayList<Item>();
        public ListItem() {};
        public void addItem(String str)
        {
            for(Item i: this.li)
            {
                if(i.val.equals(str))
                {
                    i.count++;
                    return;
                }   
            }
            this.li.add(new Item(str));
            
        }
        public String toString()
        {
            StringBuffer sb= new StringBuffer();
            this.li.forEach(i->sb.append(i+"\n"));
            return sb.toString();
        }
    }
    static class Item
    {
        public String val;
        public int count=1;
        
        public Item(String val)
        {
            this.val = val;
        }
        
        public String toString()
        {
            return "val="+this.val+" count="+this.count;
        }
    }
}

Output:

key=a
val=a1 count=3
val=a2 count=1
val=a3 count=1

key=b
val=b1 count=1
val=b2 count=4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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