查找多个键是否映射到相同的值

时间:2014-06-29 05:13:13

标签: java collections iterator maps

在这个问题中,我必须有一个带有键和字符串值的映射,以查看多个键是否映射到相同的值。换句话说,我的方法应该返回true,没有两个键映射到相同的值,如果是,则返回false。我尝试解决这个问题的方法是将所有地图放入一个集合中并检查每个元素以查看是否有两个相同值的副本;然而,这似乎并不适合我。任何建议将不胜感激,谢谢。

提示:

编写一个方法isUnique,它接受从字符串到字符串的Map作为参数,如果没有两个键映射到相同的值,则返回true(如果任何两个或多个键映射到相同的值,则返回false)。例如,在以下地图上调用您的方法将返回true:

{Marty = Stepp,Stuart = Reges,Jessica = Miller,Amanda = Camp,Hal = Perkins}

在下面的地图上调用它将返回false,因为Perkins和Reges有两个映射:

{Kendrick = Perkins,Stuart = Reges,Jessica = Miller,Bruce = Reges,Hal = Perkins}

空地图被认为是唯一的,因此如果传递空地图,您的方法应返回true。

我的尝试:

public static boolean isUnique(Map<String, String> input) {
    Collection<String> values = input.values(); // stores all the values into a collection

    for (String names: values) { // goes through each string to see if any duplicates
        Iterator<String> wordList = values.iterator(); // iterates words in values collection
        int repeat = 0; // counts number of repeats
        // goes through each elem to compare to names
        if (wordList.hasNext()) {
            if (wordList.next().equals(names)) {
                repeat++;
            }
        }
        if (repeat > 1) { // if more than one copy of the value exists = multiple keys to same value
            return false; // If multiple copies of same value exists
        }
    }
    return true; // all unique values
} 

5 个答案:

答案 0 :(得分:1)

一个解决方案可以是在迭代Map期间,您可以将值存储在字符串集中。因此,如果原始Map和Set的大小相同,则没有值映射到两个或更多Map的地图。

就实施而言,可以按如下方式进行:

public boolean checkMap(Map<String, String> map) {
    Set<String> set = new HashSet<String>();

    for(Entry<String, String> entry:map.entrySet()) {
        set.add(entry.getValue);
    }

    if(map.size == set.size)
        return true;

    return false;
}

答案 1 :(得分:1)

如果我理解你的问题,那么我会一如既往地实施你的方法 -

public static <K, V> boolean isUnique(Map<K, V> input) {
  if (input == null || input.isEmpty()) {
    return true;
  }
  Set<V> set = new HashSet<V>();
  for (V value : input.values()) {
    set.add(value);
  }
  return set.size() == input.size();
}

答案 2 :(得分:1)

我能想到的最短路径是

public static boolean valuesAreUnique(Map<K,V> input) { 
    Collection<V> values = input.values();
    return (new HashSet<V>(values)).size() == values.size();
}

但是,这并不是最高效的方法,因为在构建集合时,即使找到重复项,它也会继续添加元素。因此,如果您执行以下操作,它很可能会更好地执行,这会利用add接口的Set方法的返回值。

public static boolean valuesAreUnique(Map<K,V> input) { 
    Set<V> target = new HashSet<V>();
    for (V value: input.values()) {
        boolean added = target.add(value);
        if (! added) {
            return false;
        }
    }
    return true;
}

答案 3 :(得分:1)

Shrikant Kakani和Elliott Frisch的方法是正确的。但是,我们可以通过在找到重复项后停止迭代来提高效率:

public static boolean isUnique(Map<String, String> input) {
  Set<String> uniqueValues = new HashSet<String>();
  for (String value : input.values()) {
    if (uniqueValues.contains(value)) {
      return false;
    }
    uniqueValues.add(value);
  }
  return true;
}

答案 4 :(得分:0)

本书的练习是本章特有的,据我所知,预计每个主题都有一个解决方案。可以理解的是,上面已经提交了多个更好的解决方案,但是给定的练习涵盖了与它们相关的Map,键,值和方法。第二次使用Value时,使用以下方法会停止。

    public static boolean isUnique(Map<String, String> map){
        Map<String, Integer> check = new HashMap<String, Integer>();
        for (String v : map.values()){
            if (check.containsKey(v)){
                return false;
            } else {
               check.put(v, 1);
            }
        }
        return true;        
    }