Java 7:contains 代表Map<String, List<String>>
假设和 Tom 一样,这里是 Java 7 版本(应Horse Voice 的要求):
// Live version
static boolean contains(Map<String, List<String>> map, String value) {
for (List<String> list : map.values()) {
if(list.contains(value)) return true;
}
return false;
}
如果您的源地图没有改变,可能最好创建一个搜索缓存:
// Cached version
private List<String> allValues = getInnerValues(map);
private List<String> getInnerValues(Map<String, List<String>> map) {
List<String> result = new ArrayList<>();
for (List<String> list : map.values()) {
result.addAll(list);
}
return result;
}
static boolean contains(String value) {
return allValues.contains(value);
}
Java 7:anyKeyForValue 和 keysForValue
我认为有些人会想要与值匹配的键:
// Live version
static String anyKeyForValue(Map<String, List<String>> map, String value) {
for (Entry<String, List<String>> entry : map.entrySet()) {
if(entry.getValue().contains(value)) return entry.getKey();
}
return null;
}
static List<String> keysForValue(Map<String, List<String>> map, String value) {
List<String> result = new ArrayList<>();
for (Entry<String, List<String>> entry : map.entrySet()) {
if(entry.getValue().contains(value)) result.add(entry.getKey());
}
return result;
}
缓存有点困难;我们需要反转地图:
// Cached version
private Map<String, List<String>> valueKeys = invert(map);
private Map<String, List<String>> invert(Map<String, List<String>> map) {
Map<String, List<String>> result = new HashMap<>();
for (Entry<String, List<String>> entry : map.entrySet()) {
for (value : entry.getValue()) {
List<String> keys;
if (result.containsKey(value)) {
keys = result.get(value);
} else {
keys = new ArrayList<String>();
result.put(value, keys);
}
keys.add(entry.getKey());
}
}
return result;
}
static List<String> keysForValue(String value) {
return valueKeys.get(value);
}