![](/img/trans.png)
[英]How to iterate List<Map<String, Object>> and add the key and value dynamically in another hash map in java
[英]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.