2014-07-18 141 views
0

我想將我在Java中編寫的算法轉換爲Scala,但是我在使用Java中的containsValue()方法時遇到了問題。我想要做類似if (hashMap.containsValue(value))的事情,但我查看了scala文檔,只找到了一個包含(關鍵)方法。 如何實現或使用hashmap.containsValue(值)Scala中我還是新來斯卡拉,但這裏是我迄今爲止在斯卡拉:Scala HashMap containsValue方法

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

} 

` 完整的算法我想轉換是removeDuplicates我在Java中寫道:

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; 

} 
+2

嘿,你爲什麼不加入你想轉換的java算法?將幫助我們理解你在做什麼? – Mick

+0

好吧,編輯它 – John61590

+0

通常,對於這種'removeDuplicates'算法,您可以創建一個* set *您嘗試去重複的東西。 containsValue方法是O(n),因此您的算法是O(n^2)。你可以在O(n log(n))中用一個集合來完成它(即使你還保存了一個索引映射到值來保持排序)。 –

回答

5

您可以使用exists

map.values.exists(_ == c) 
+0

下劃線如何使用? (抱歉還在學習^^) – John61590

+0

@ John61590我們正在創建一個單參數lambda函數,用於測試其一個參數和'c'之間的相等性。請參閱:http://www.scala-lang.org/old/node/133。 – arshajii

0

containsValue永遠不會是一個有效的操作,因爲它不能在HashMap中使用任何特殊的魔力。

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

在Java中

即:

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

或可替代只是:

map.values().contains(search); 
1

讓知道的HashMap contaning這個值可以使用

hashMap.exists(_._2 == c) 

你想是這樣的 Java來斯卡拉;)

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 
    } 
+0

此代碼中沒有使用當前變量。另外,keySet似乎沒有以正確的順序得到字符,並且結果返回Some(字符)而不是整個字符串。 – John61590

+0

@ John61590哎呀我只是根據OP進行轉換,我忘記'當前'在'if'中 –

0

你可能會很高興知道,Scala集合包含distinct方法:

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

有一個Stack Overflow discussion實施distinctBy這是有點看看。