【问题标题】:How to search a partial "value" in a map containing String values and Integer keys in Java?如何在包含 Java 中的字符串值和整数键的映射中搜索部分“值”?
【发布时间】:2016-04-23 16:35:24
【问题描述】:

我有以下代码,用于通过将其转换为字符串并使用 contains() 方法在 Map 映射中搜索“值”的一部分。问题是,如果我搜索任何整数值(例如“4”),conatins() 方法会返回 true,因为它会找到与“key”匹配的。

 public ArrayList<Map<Integer, String>> search(final ArrayList<Map<Integer, String>> myMapList, String searchTerm)
{
    ArrayList<Map<Integer, String>> newListOfMaps = new ArrayList<Map<Integer, String>>();

    for (Map<Integer, String> map : myMapList)
    {
        if (map.toString().contains(searchTerm))
        {
            newListOfMaps.add(map);
        }
    }
    return newListOfMaps;
}

示例数据:

  • myMapList.get(0)= {1=laptop, 2=4, 3=stackover, 4=flow}
  • myMapList.get(1)= {1=laptop, 2=pc, 3=stackover, 4=flow}

案例 1:如果我的“searchTerm”是“top”,我希望返回两个地图。

案例 2:如果我的“searchTerm”是“4”,我只想要返回的第一张地图。

但我要让他们两个都回来了。

有没有更好的在地图中搜索的方法?

【问题讨论】:

  • 如果将 Map 转换为字符串(通过对其调用 toString()),返回的字符串将包含键和值。在搜索目标字符串之前调用 map.values() 只获取值。
  • 如果您正在搜索值,我发现 BiMap 可以派上用场。您可以反转映射,然后使用该值作为键。所以在你的情况下, map.get(searchTerm) google-collections.googlecode.com/svn/trunk/javadoc/com/google/…

标签: java search dictionary collections linked-list


【解决方案1】:

我们必须搜索每个映射中的每个值(除非我们使用 Java 8 lambda 表达式,我猜)

    public static ArrayList<Map<Integer, String>> search(final ArrayList<Map<Integer, String>> myMapList, String searchTerm)
    {
        ArrayList<Map<Integer, String>> newListOfMaps = new ArrayList<Map<Integer, String>>();

        for (Map<Integer, String> map : myMapList)
        {

            for (String value : map.values())
            {
                if (value.contains(searchTerm)){
                    newListOfMaps.add(map);
                    break;
                }
            }
        }
        return newListOfMaps;
    }
}

可在此处找到可编辑的代码:https://ideone.com/0Fs6uG

编辑:使用 lambda 表达式,整个方法可以替换为以下任一:

return myMapList.stream().filter(map -> map.values().toString().contains(searchTerm)).collect(Collectors.toList());

return myMapList.stream().filter(map -> map.values().stream().anyMatch(str -> str.contains(searchTerm))).collect(Collectors.toList());

我更喜欢后者,因为当本身包含逗号时会避免困难。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 2015-10-14
    • 1970-01-01
    • 2023-03-28
    • 2018-07-23
    • 1970-01-01
    相关资源
    最近更新 更多