代码之家  ›  专栏  ›  技术社区  ›  Lluis Martinez

检查映射中的所有值是否相等

  •  4
  • Lluis Martinez  · 技术社区  · 10 年前

    我需要检查地图中的所有值是否相等。我有一个方法来执行此任务,但希望使用库或本机方法。限制:Java5+ApacheCommons库。

    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;
    }
    
    6 回复  |  直到 10 年前
        1
  •  15
  •   a_horse_with_no_name    10 年前

    这件事怎么样

    Set<String> values = new HashSet<String>(aMap.values());
    boolean isUnique = values.size() == 1;
    
        2
  •  2
  •   Abhijeet Kushe    10 年前

    怎么样

    return (new HashSet(aMap.values()).size() == 1)
    
        3
  •  2
  •   Justin Gottshall    7 年前

    我知道最初的问题要求在Java5中找到解决方案,但如果其他人搜索这个问题的答案不限于Java5,这里是Java8方法。

    return aMap.values().stream().distinct().limit(2).count() < 2
    
        4
  •  1
  •   David Ehrmann    10 年前

    你可以 百货商店 a中的值 Bidirectional Map 并且始终具有此属性。

        5
  •  1
  •   Meno Hochschild    10 年前
    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 (如果您 地图 不包含空值):

    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;
    }
    
        6
  •  1
  •   nachokk    10 年前

    正如我上面的评论:

    //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;
        }