我需要检查地图中的所有值是否相等。我有一个方法来执行此任务,但想使用库或本机方法。限制:Java 5 + Apache Commons库。
public static boolean isUnique(Map<Dboid,?> aMap){
boolean isUnique = true;
Object currValue = null;
int iteration = 0;
Iterator<?> it = aMap.entrySet().iterator();
while(it.hasNext() && isUnique){
iteration++;
Object value = it.next();
if(iteration > 1){
if (value != null && currValue == null ||
value == null && currValue != null ||
value != null && currValue != null & !value.equals(currValue)) {
isUnique = false;
}
}
currValue = value;
}
return isUnique;
}
答案 0 :(得分:10)
这样的事情怎么样:
Set<String> values = new HashSet<String>(aMap.values());
boolean isUnique = values.size() == 1;
答案 1 :(得分:1)
您可以存储 Bidirectional Map中的值并始终拥有此属性。
答案 2 :(得分:1)
正如我上面的评论:
//think in a more proper name isAllValuesAreUnique for example
public static boolean isUnique(Map<Dboid,?> aMap){
if(aMap == null)
return true; // or throw IlegalArgumentException()
Collection<?> c = aMap.getValues();
return new HashSet<>(c).size() <= 1;
}
答案 3 :(得分:1)
public static boolean isUnique(Map<Dboid,?> aMap) {
Set<Object> values = new HashSet<Object>();
for (Map.Entry<Dboid,?> entry : aMap.entrySet()) {
if (!values.isEmpty() && values.add(entry.getValue())) {
return false;
}
}
return true;
}
如果地图上存在许多差异,此解决方案的优势在于可以提供节省内存的快捷方式。对于空Map
的特殊情况,您可以选择false
作为返回值,根据您的目的进行相应更改。
如果没有Set
(如果您的Map
不包含空值),甚至会更好:
public static boolean isUnique(Map<Dboid,?> aMap) {
Object value = null;
for (Object entry : aMap.values()) {
if (value == null) {
value = entry;
} else if (!value.equals(entry)) {
return false;
}
}
return true;
}
答案 4 :(得分:1)
我知道原始问题要求Java 5中的解决方案,但是如果其他人在寻找这个问题的答案并不仅限于Java 5,这里是Java 8方法。
return aMap.values().stream().distinct().limit(2).count() < 2
答案 5 :(得分:0)
怎么样
return (new HashSet(aMap.values()).size() == 1)