【问题标题】:Searching for a value in an ArrayList that is stored in a HashMap在 ArrayList 中搜索存储在 HashMap 中的值
【发布时间】:2018-10-03 16:43:57
【问题描述】:

我试图弄清楚如何检索存储在 ArrayList 中、存储在 Hashmap 中的值。

这是我所拥有的:

HashMap<String, ArrayList<Record>> records = new HashMap<>();

这个哈希图中的键不是我要找的。 Record 对象内部有一个名为 getRecordId() 的方法,我希望能够通过 if 语句评估此 recordId 是否存在于 ArrayList 中。

例子:

if(records.values.exists(recordId)){ ...do something ...}

本质上,我想遍历 ArrayList 中的所有值以查看该记录 ID 是否存在,如果存在,我将存储密钥并计算一些东西。我该怎么做?

编辑:在发布这个问题之后,我想我正在做一些事情。这个怎么样:

Set<Map.Entry<String, ArrayList<Record>>> entrySet = records.entrySet();
for(Map.Entry<String, ArrayList<Record>> data : entrySet)
{
    for(Record entry : data.getValue())
    {
        if(recordId.equals(entry.getRecordId()))
        {
            // Do something here
            return "";
        }
    }
}

如果找到记录 ID,我需要离开循环,因为记录 ID 是唯一的。

【问题讨论】:

  • 你想在Record中找到一些id并返回键,记录列表还是什么?

标签: java search arraylist hashmap


【解决方案1】:

您可以在这里使用Hashmap.entrySet() 来获取所有键的列表,并遍历该键集,并检查该特定迭代的ArrayList 中是否存在recordId,然后存储键并进行计算。

如果您不确定entrySet 的语法和用法,可以在此处查看 - https://www.geeksforgeeks.org/iterate-map-java/

【讨论】:

    【解决方案2】:
    for (Map.Entry<String, ArrayList> data : records) {
                ArrayList list = (ArrayList) data.getValue();
                for (int i = 0; i < list.size(); i++) {
                    if (list.get(i).equals(recordId)) {
                        // do something
                    }
                }
            }
    

    【讨论】:

      【解决方案3】:

      如果你使用Java 8,你可以使用stream

      //List of keys which contains your desired Record at it's value(ArrayList)
      List<String> requiredListOfKeys = records.keySet().stream()
                                                        .filter(x -> records.get(x)
                                                        .contains(record))
                                                        .collect(Collectors.toList());
      

      【讨论】:

        【解决方案4】:

        一种方法是流式传输地图值,并为每个值(这是一个列表)流式传输并找到第一个与您的搜索条件匹配的 Record 实例。然后,如果找到这样的记录,对它做任何你想做的事情:

        boolean found = records.values().stream()
            .flatMap(List::stream) // or .flatMap(list -> list.stream())
            .filter(entry -> recordId.equals(entry.getRecordId()))
            .findFirst()
            .ifPresent(entry -> {
                // do something with the found record
            });
        

        【讨论】:

          【解决方案5】:

          您可以使用以下语法:

          records.forEach((k, v) -> {
              if (v.contains(recordId)) {
                  // do something with 'k'
              }
          });
          

          这里我们使用forEach 遍历地图。 k 代表键,v 代表值。您也可以使用entrySet

          records.entrySet().forEach(e -> {
              if (e.getValue().contains(recordId)) {
                  // do something with 'e.getKey()'
              }
          });
          

          【讨论】:

          • 这个 lambda 表达式很棒!编辑了我的原始帖子,您能验证我所做的是否正确吗?
          • 是的,是的。如果我的回答有帮助,请点赞并接受! Break 只会退出 1 个循环。
          • 这里的问题是contains 将始终返回false,因为您将"your_id"(这是一个字符串)与数组列表的每个元素进行比较,这是一个Record实例。
          • 对!我在我的 IDE 中使用 String 检查了它,因为我没有 Record 类 :) 但我认为他明白了。谢谢你,进行了编辑。
          • 如果在ArrayList中找到了那条记录,那么我需要修改一些字段并返回。我认为在这种情况下嵌套的 foreach 循环会更合适。
          猜你喜欢
          • 1970-01-01
          • 2017-12-23
          • 1970-01-01
          • 2019-02-14
          • 1970-01-01
          • 2013-11-01
          • 2023-04-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多