2013-09-23 2 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

Вы действительно используете Boolean для ключа или это опечатка? – Surveon

+2

Не используйте «HashMap», все, что вам нужно, это «HashSet». – Marcelo

+1

В дополнение к тому, что сказал Джон и Свервей, было бы лучше использовать 'Set ' вместо 'Map '. –

ответ

11

Вы выборка по характеру, но ключ вашей карты является Boolean. Вы хотите, чтобы ключ был Character и значение быть Boolean:

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' в качестве реализации, но' Set' для переменной. Исправлена. –

1

, возможно, вы делаете получить на «значение» не key.so попробуйте перевернуть вашу HashMap, как

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

то не получают так же, как вы выполнив tab.get (c).

Смежные вопросы