当前位置: 首页 > 知识库问答 >
问题:

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

云航
2023-03-14

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

提示:

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

{马蒂=斯捷普,斯图尔特=瑞吉斯,杰西卡=米勒,阿曼达=坎普,哈尔=珀金斯}

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

{肯德里克=珀金斯,斯图尔特=瑞吉斯,杰西卡=米勒,布鲁斯=瑞吉斯,哈尔=珀金斯}

空映射被认为是唯一的,因此如果传递空映射,您的方法应该返回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
} 

共有3个答案

邢硕
2023-03-14

我能想到的最短方法是

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

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

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;
}
后焕
2023-03-14

一种解决方案是在遍历映射的过程中,可以将值存储在一组字符串中。因此,如果原始贴图和集合的大小相同,则不存在映射到贴图的两个或多个键的值。

就实施而言,可以这样做:

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;
}
公西良骏
2023-03-14

如果我理解你的问题,那么我会像这样实现你的方法-

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();
}
 类似资料:
  • 问题内容: 我正在尝试建立一个PostgreSQL表,该表具有两个指向另一个表中相同主键的外键。 运行脚本时出现错误 sqlalchemy.exc.AmbiguousForeignKeysError:无法确定关系Company.stakeholder的父/子表之间的联接条件- 有多个链接表的外键路径。指定“ foreign_keys”参数,提供这些列的列表,这些列应被视为包含对父表的外键引用。 那

  • 假设我们有一个键-值映射的数据结构,其中键本身也是一个键-值映射。例如: 现在,假设我们要查询此映射中与键的某个键值子集匹配的所有顶级键/值。示例: 我们的查询是“给我所有key值,其中key包含,它将返回第一个和第三个值将返回所有同时具有和的键值,生成第二个值。显然,我们可以在每一个查询的完整地图中进行搜索,但我正在寻找比这更高效的方法。 我四处查看了一下,但是找不到一个高效、易用的C解决方案。

  • 我的应用程序中有两个方法,它们使用相同的请求映射和不同的(http)方法 是否有可能在不同的控制器中定义它们,或者我应该考虑一些(可怕的)变通方法(比如重命名一个URL)?

  • 问题内容: 我认为我的问题与此相似:如何实现具有多个键的Map?但有一个重要的区别。在这个问题中(如果我对它的理解是正确的,请告诉我是否正确),这些键应该总是唯一的。我想要一个Map形式: MyMap ,其中的键不一定是唯一的。如果那没有任何意义,我基本上想要一个二维数组,而不是通过坐标对引用元素,而是通过对象对引用它们。 是否有人对可以在其中工作的图书馆或自己实现此想法的好方法有任何想法?就库而

  • 我会从我想达到的目标开始 意图 该软件在for循环中解析XML数据。处理数据的 for 循环将持续到 50(因为我得到了 50 个不同的结果)。我最初所做的是,-方法解析整个XML数据并将其保存到TextViews中并显示它。但现在我想添加一个启动画面,只要数据加载就会显示。 XML文件像任何其他普通XML文件一样构建,因此当我通过for循环时,键总是相同的,但值不同。 方法 我已经做的是创建一个

  • 我有一个pojo类,我在其中使用Hibernate注释。在我的数据库中,我有两个模式相似的表。我想知道在hibernate注释中是否有任何方法可以将同一个pojo类用于这两个表。请告诉我怎么做。