比较存储为列表结构的

时间:2017-02-20 00:19:22

标签: java list arraylist data-structures hashmap

我有一个hashmap,它的键是String,值存储为List。

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

因为我在同一个键下有多个值。 所以例如我有4个键,值是:

[1681,3523]

[276,489]

[1527,2865]

[300]

我还有另一个treeList,其中包含这些值作为已排序。我想做的是(并询问);

Iterator<Integer> itr=myTreeSet.iterator();
    while(itr.hasNext())
    {
        int check = itr.next();
        for(Object value : map2.entrySet())
        {
            //System.out.println("Value is :" + value);

        }
    }

我想检查itr,如代码所示,使用我的Hashmap entrySet,如果equals返回hashmap key.Above代码将entrySet作为数组返回。简单地说,如何检查它属于hashmap的entrySet并属于哪个键。

我将map1和map2作为参数

static void game(Map map1, Map map2, Hero h, HashSet< Integer> hash)

我很抱歉。我并不清楚,我想你很困惑。我首先在main func中定义这些地图:

Map<String, Enemy> enemymap = new HashMap<>();
Map<String,List<Integer>> posmap = new HashMap<>();

我也把它们填满了主要功能。填写完毕后,我将它们发送到我的功能游戏中。 posmap是map2。所以我指的是posmap。抱歉混淆。 完整的代码。

static void game(Map map1, Map map2, Hero h, HashSet< Integer> hash)
{
    TreeSet<Integer> myTreeSet = new TreeSet<>(); // For sorting min to max-for alignment
    myTreeSet.addAll(myHashset);
    System.out.println(myTreeSet);
    String start = "Micheal started travel with" + " " + h.getHealth() + " " + "HP!";
    Iterator<Integer> itr=myTreeSet.iterator();
    while(itr.hasNext())
    {
        int check = itr.next();
        /* for(Map.Entry<String, List<Integer>> entry : map2.entrySet())
            {
                if(entry.getValue() != null && entry.getValue().contains(check))
                System.out.println("The key " + entry.getKey() + "contains the treeset value " + check);

            } -/
    }

}

从主要功能发送:

game(enemymap, posmap , hero, myHashset);

3 个答案:

答案 0 :(得分:2)

其他解决方案打印或返回单个密钥。根据你的简短原帖,我以为你想要一套,所以这就是我所做的。

用@ ajb的建议编辑:

Set<Integer> myTreeSet = new TreeSet<>();
Map<String,List<Integer>> posmap = new HashMap<>();
Iterator<Integer> itr = myTreeSet.iterator();

//The set of keys containing values in any list of posmap
Set<String> matchedKeys = new HashSet<>();

//Iterate through the TreeSet Integers
itr.forEachRemaining(itrVal -> {
   //Stream each entry of the posmap
   posmap.entrySet().stream()
         //Remove the entries without the itrVal in the entry's list
         .filter(entry -> entry.getValue().contains(itrVal))
         //Add each key with a match to the set
         .forEach(matchedEntry -> matchedKeys.add(matchedEntry.getKey()));
});

return matchedKeys;

如果您拥有Apache Commons,这可能是一个很好的方法:

Set<Integer> myTreeSet = new TreeSet<>();
Map<String,List<Integer>> posmap = new HashMap<>();
Iterator<Integer> itr = myTreeSet.iterator();

Set<String> matchedKeys = new HashSet<>();

List<Integer> treeSetValues = IteratorUtils.toList(itr);

treeSetValues.stream().map(val -> {
   return posmap.entrySet().stream()
         .filter(entry -> entry.getValue().contains(itrVal))
         .collect(Collectors.toSet());
});

return matchedKeys;

如果你不能使用IteratorUtils.toList(),你可以使用Guava和Lists.newArrayList()。

答案 1 :(得分:1)

我会推荐以下方法:

Iterator<Integer> itr=myTreeSet.iterator();
while(itr.hasNext())
{
    int check = itr.next();
    for(Map.Entry<String, List<Integer>> entry : map2.entrySet())
    {
        if(entry.getValue() != null && entry.getValue().contains(check))
        System.out.println("The key " + entry.getKey() + "contains the treeset value " + check);

    }
}

答案 2 :(得分:1)

因为你不记得你在hashmap中存储int时使用的hashkey,你需要检查int是否在hash的任何值中。

for(Map.Entry<String,List<Integer>>entry: map2.values()) {
    if( entry.getValue().contains(check) ) return entry.getKey();
}

类似的东西。