【问题标题】:Scala HashMap containsValue methodScala HashMap containsValue 方法
【发布时间】:2014-07-18 22:38:40
【问题描述】:

我正在尝试将我用 Java 编写的这个算法翻译成 Scala,但我在使用 Java 中的 containsValue() 方法时遇到了问题。我想做类似if (hashMap.containsValue(value)) 的事情,但我查看了 scala 文档,只找到了一个 contains(key) 方法。 你如何在 Scala 中实现或使用 hashmap.containsValue(value) 我还是 Scala 的新手,但这是我目前在 Scala 中所拥有的:

def retString(s: String)
{
  val map = new mutable.HashMap[Int, Char]
  for (c <- s.toCharArray)
  {
      //if(!map.containsValue(c)) goes here
  }

}

` 我尝试转换的完整算法是我用 Java 编写的 removeDuplicates:

public static String removeDuplicates(char[] s)
{

    HashMap<Integer, Character> hashMap = new HashMap<Integer, Character>();
    int current = 0;
    int last = 0;
    for(; current < s.length; current++)
    {
         if (!(hashMap.containsValue(s[current])))
         {
              s[last++] = s[current];
              hashMap.put(current, s[current]);

         }
    }
    s[last] = '\0';
    //iterate over the keys and find the values
    String result = "";
    for (Integer key: hashMap.keySet()) {
        result += hashMap.get(key);
    }
    return result;

}

【问题讨论】:

  • 嘿,你为什么不添加你想转换的java算法呢?将帮助我们了解您想要做什么?
  • 通常,对于这种removeDuplicates 算法,您会创建一个您要尝试去重的事物。 containsValue 方法是 O(n),因此您的算法是 O(n^2)。您可以使用一组在 O(n log(n)) 中执行此操作(即使您还保留索引到值的映射以保持排序)。
  • @WillFitzgerald ?这是 O(2n) 而不是 O(n^2)。 O(n) 如果您不计算打印输出。
  • 您必须对每个项目进行 O(n) 比较,所以它是 O(n^2)。我错过了什么?

标签: java scala collections hashmap


【解决方案1】:

你可以使用exists:

map.values.exists(_ == c)

【讨论】:

  • @John61590 我们正在创建一个单参数 lambda 函数,用于测试其一个参数与 c 之间的相等性。请参阅:scala-lang.org/old/node/133
【解决方案2】:

要了解包含此值的哈希图,您可以使用

hashMap.exists(_._2 == c)

你想要这样的东西 java 到 scala ;)

def removeDuplicates(s: Array[Char]): String = {
    val hashMap = new scala.collection.mutable.HashMap[Integer, Character]()
    var c = 0
    var last = 0
    while (c< s.length) {
      if (!(hashMap.exists(_._2 == c))){
        last+=1
        s(last) = s(c)
        hashMap.put(c, s(c))
      }
      c += 1
    }
    s(last) = '\0'
    var result = ""
    for (key <- hashMap.keySet) {
      result += hashMap.get(key)
    }
    result
  }

【讨论】:

  • 此代码中没有使用当前变量。此外,keySet 似乎没有以正确的顺序获取字符,结果返回 Some(character) 而不是整个字符串。
  • @John61590 哎呀,我刚刚根据 OP 转换,我忘记了 if 中的 current
【解决方案3】:

containsValue 永远不会是一个高效的操作,因为它不能使用 HashMap 中的任何特殊魔法。

因此,您可以自己迭代值集合并获得完全相同的性能。

即在 Java 中:

for (Ob ob: map.values()) {
    if (search.equals(ob))
       return search;
}

或者只是:

map.values().contains(search);

【讨论】:

    【解决方案4】:

    您可能很高兴知道 Scala 集合包含 distinct 方法:

    > List(1,1,1,2,3,3,2,1).distinct
    > List(1,2,3)
    

    有一个关于实现distinctByStack Overflow discussion,这有点有用。

    【讨论】:

      猜你喜欢
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多