我试图将我用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;
}
答案 0 :(得分:5)
您可以使用exists
:
map.values.exists(_ == c)
答案 1 :(得分:1)
要知道包含此值的hashmap,您可以使用
hashMap.exists(_._2 == c)
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
}
答案 2 :(得分:0)
containsValue
永远不会是一个有效的操作,因为它不能使用HashMap中的任何特殊魔法。
因此,您可以自己迭代值集合并获得完全相同的性能。
即。在Java中:
for (Ob ob: map.values()) {
if (search.equals(ob))
return search;
}
或者只是:
map.values().contains(search);
答案 3 :(得分:0)
您可能很高兴知道Scala集合包含distinct
方法:
> List(1,1,1,2,3,3,2,1).distinct
> List(1,2,3)
实施distinctBy
时有一个Stack Overflow discussion,这看起来有点用。