我如何从我的价值中获得钥匙?
我的HashMap:
public static final Map<String, List<String>> Server = new HashMap<>();
我的尝试:
public static Object getKeyFromValue(String value) {
for (Object o : Server.keySet()) {
if (Server.get(o).equals(value)) {
return o;
}
}
return null;
}
它很有效,因为值是一个列表。
答案 0 :(得分:1)
if (Server.get(o).contains(value)) {
//...
}
答案 1 :(得分:0)
当您对Map
进行迭代时,如果您需要密钥和值,则最好迭代entrySet
而不是keySet
。
public static String getKeyFromValue(String value) {
for (Map.Entry<String, List<String>> e : Server.entrySet()) {
if (e.getValue().contains(value)) {
return e.getKey();
}
}
return null;
}
这应该有效,但有三件事我不喜欢(除了Server
以大写字母开头)。
contains
实施(包括List
和ArrayList
)的LinkedList
速度很慢,因为它是线性搜索。最好使用HashSet
代替。value
出现在地图中的多个列表中,则返回的密钥可以是多个答案中的任何一个。方法的名称可能更好地表明这一点(例如getAnyKeyForValue
)。Optional<String>
而不是使用null
表示未找到该值。Java 8解决方案,考虑所有这些要点并利用并行性将是
public static Optional<String> getAnyKeyForValue(String value) {
return Server.entrySet()
.parallelStream()
.filter(e->e.getValue().contains(value))
.map(Map.Entry::getKey)
.findAny();
}
答案 2 :(得分:0)
从等于改变包含作品。并且所有都保持不变
public static Object getKeyFromValue(String value) {
for (Object o : Server.keySet()) {
if (Server.get(o).contains(value)) {
return o;
}
}
return null;
}