【问题标题】:Get Map key and value from two different Map with key and vlue in java从两个不同的 Map 中获取 Map 的键和值,其中包含 java 中的键和值
【发布时间】:2017-10-11 19:43:41
【问题描述】:

有两个 Map,第一个包含学生 id 和 name。第二个包含学生 ID 和“通过”或“失败”状态。有一个方法,它接受两个 Map 类型的参数并返回 Map。

    //1st Map
    Map<Integer, String> map1 = new HashMap<>();
    map1.put(1, "x");
    map1.put(2, "y");
    map1.put(3, "z");
    map1.put(4, "a");
    map1.put(5, "b");`

    //2nd Map
    Map<Integer, String> map2 = new HashMap<>();
    map2.put(1, "fail");
    map2.put(2, "fail");
    map2.put(3, "fail");
    map2.put(4, "pass");
    map2.put(5, "pass");`

   //the method
public Map<Integer, String>findFaildStudent(Map<Integer, String>map1,Map<Integer, String>map2){
returns Map<Integer, String>;
 }

所以,我的问题是如何找到不及格学生的记录。我自己也试过,但没有成功。任何帮助表示赞赏。

到目前为止我尝试了什么

public Map<Integer, String>findFaildStudent(Map<Integer, String>map1,Map<Integer, String>map2){
    Integer key = null;
    String value = null;

    Iterator<Entry<Integer, String>> iterator = map1.entrySet().iterator();
    while(iterator.hasNext()){
        Entry<Integer, String> next = iterator.next();
        key = next.getKey();
    }

    Iterator<Entry<Integer, String>> iterator2 = map2.entrySet().iterator();
    while(iterator2.hasNext()){
        Entry<Integer, String> next = iterator2.next();
        value=next.getValue();
    }

    Map<Integer,String> hashMap = new HashMap<>();
    hashMap.put(key, value);

    return hashMap;

}

【问题讨论】:

  • 让您的生活变得简单,并使用这些字段创建一个类,然后制作您想要的任意数量的对象,将其存储到某种列表中并查询结果。
  • “我自己尝试过,但没有成功”。那么您尝试了什么?以何种方式“不成功”?
  • @Blorgbeard 我尝试迭代第一个 Map 并获取密钥,然后迭代第二个 Map 并获取值并将其放入新 Map 并从方法返回。
  • 那么你能告诉我们这段代码,并解释它有什么问题吗?
  • @Aominè:我不能按照你的建议去做。

标签: java collections hashmap


【解决方案1】:
public Map<String, String> findFaildStudent(Map<Integer, String>map1,Map<Integer, String>map2){
    Map<String, String> failed = new HashMap<>();

    for (Map.Entry<Integer, String> k : map2.entrySet()) {
        if(k.getValue().equals("fail")){
            failed.put(map1.get(k.getKey()), map2.get(k.getValue()));
        }
    }
    return failed;
 }
//returns... ("x","failed"), ("y", "failed"), ("z", "failed")

所以基本上你只需要遍历第二张地图,因为它包含失败的学生,然后你得到密钥并使用该密钥来获取 map1 的值。 您不能连接键,因为键是唯一的,因此如果要将两个映射组合在一起,最好使用 map1(value) 作为键和 map2(value) 作为值创建另一个映射。希望我能理解您的问题,但如果您只想要失败学生的 map2,请尝试以下操作。

public Map<Integer, String> findFaildStudent(Map<Integer, String>map1,Map<Integer, String>map2){
Map<Integer, String> failed = new HashMap<>();

for (Map.Entry<Integer, String> k : map2.entrySet()) {
    if(k.getValue().equals("fail")){
        failed.put(k.getKey(), map1.get(k.getKey()));
    }
}
return failed;
//returns... (1,"x"), (2, "y"), (3, "z")

【讨论】:

  • 但是我的方法呢?我的意思是我必须用那个方法来做。
  • 所以回到你的问题是 map1 与 map2 有任何关系吗?
  • 所以你是说我不必遍历第一张地图?
  • 不,它们不相关,除非它们共享相同的密钥。
  • 很抱歉,您的问题在这里没有得到解答,但您到底希望得到什么回报?你能给我一些例子吗?像 (x, "failed") (y, "failed) (z, "failed) 或只是 (1, "failed), (2, "failed), (3, "failed)。如果你期待第一组然后使用顶部(添加一个带有 而不是 的新地图,如果您期待第二组,请使用底部。
【解决方案2】:
map1.entrySet().stream()
    .filter(entry -> "fail".equals(map2.get(entry.getKey())))
    .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue()));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-20
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多