2013-09-23 47 views
3

我寫了一個方法來檢查一個字符串是否只有唯一的字符。我發給它明顯的非唯一字符串"11",它返回true而不是false。發生這種情況的原因是get(c)中的if (tab.get(c) == null)返回null,即使字符'1'已經在HashMap中。爲什麼HashMap的get()在它不應該返回時返回null?

我能做些什麼來獲得預期的行爲?

/* Check if a string contains only unique characters */ 
public static boolean isUniqueChars(String s) { 

    HashMap<Boolean, Character> tab = new HashMap<Boolean, Character>(); 
    Character c; 

    for (int i = 0; i < s.length(); ++i) { 
     c = new Character(s.charAt(i)); 
     if (tab.get(c) == null) 
      tab.put(Boolean.TRUE, c); 
     else 
      return false; 
    } 
    return true; 
} 

public static void main(String[] args) { 

    String s = "11"; 
    System.out.println(isUniqueChars(s)); /* prints true! why?! */ 
} 
+5

你真的使用布爾值作爲鍵還是錯字? – Surveon

+2

不要使用'HashMap',你只需要一個'HashSet'。 – Marcelo

+1

除了Jon和安業長說的話 - 使用'Set '代替'Map '可能會更好。 –

回答

11

取由字符,但地圖的關鍵是Boolean。你想關鍵是CharacterBoolean

HashMap<Character, Boolean> tab = new HashMap<Character, Boolean>(); 
Character c; 

for (int i = 0; i < s.length(); ++i) { 
    c = new Character(s.charAt(i)); 
    if (tab.get(c) == null) 
     tab.put(c, Boolean.TRUE); 
    else 
     return false; 
} 
return true; 

說了:

  • 你並不需要顯式地創建一個新的Character。拳擊將爲你做到這一點。
  • 使用HashSet<Character>來跟蹤您迄今看到的字符會更簡單。

例如:

Set<Character> set = new HashSet<Character>(); 
for (int i = 0; i < s.length(); i++) { 
    Character c = s.charAt(i); 
    // add returns true if the element was added (i.e. it's new) and false 
    // otherwise (we've seen this character before) 
    if (!set.add(c)) { 
     return false; 
    } 
} 
return true; 
+0

謝謝!現在很明顯。 –

+0

設置與HashSet相同嗎? – Paparazzi

+0

@Blam:糟糕,本意是使用'HashSet'作爲實現,但設置'變量。固定。 –

1

也許你正在做的 「價值」 不是一個GET key.so嘗試扭轉你的HashMap作爲

HashMap<Character,Boolean> tab = new HashMap<Character, Boolean>(); 

那就不要讓你以同樣的方式做tab.get(c)。

相關問題