>我有以下代码,我正在使用它通过将其转换为字符串并使用contains()方法来搜索地图中的"值"的一部分。问题是如果我搜索任何整数值(例如"4"),conatins() 方法返回 true,因为它找到与"键"匹配。
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:如果我的"搜索词"是"top",我希望返回两个地图。
情况2:如果我的"搜索词"是"4",我只想返回第一张地图。
但我正在让他们两个回来。
有没有更好的方法来
我们必须搜索每个映射中的每个值(除非我们使用的是 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());
我更喜欢后者,因为当值本身包含逗号时,它可以避免困难。