2014-02-05 3 views
1

Я не знаю, почему я получаю ошибку при моей put:вставки в Hashtable <Character, Список <Boolean>>

The method put(Character, List<Boolean>) in the type 
Hashtable<Character,List<Boolean>> is not applicable for the arguments (char, boolean) 

Я думаю, что у меня есть все типы соответствия

Вот мой код

Hashtable<Character, List<Boolean>> charCheck = 
     new Hashtable<Character, List<Boolean>>(); 
    List<Boolean> used = new ArrayList<Boolean>(); 
    //Set<String> nonDuplicate = new Set<String>(); 
    // make a hashtable of characters used 
    char[] charArray = str.toCharArray(); 
    for (char c : charArray) { 
     charCheck.put(c, used.add(false)); 
+3

Ваш 'значения Hashtable' предназначены для' 'Список , но вы пытаетесь поставить' используется. add (false) ', который возвращает прежнее значение, которое будет иметь тип' Boolean'. –

+2

@SotiriosDelimanolis: Исправление: 'add' возвращает' boolean', а не 'Boolean', и независимо от типа списка: это показатель того, изменился ли список. –

+0

Кстати, почему вы используете 'Hashtable', а не' HashMap'? – Mureinik

ответ

2

List#add метод в Java возвращает boolean указание, является ли значение WS успешно добавлен в List или нет. Вы должны отделить добавление нового List к вашему Map добавления нового элемента к нему:

Hashtable<Character, List<Boolean>> charCheck = new Hashtable<Character, List<Boolean>>(); 
char[] charArray = str.toCharArray(); 

for (char c : charArray) { 
    List<Boolean> used = charCheck.get(c); 

    // If the char isn't in the map yet, add a new list 
    if (used == null) { 
     used = new ArrayList<Boolean>(); 
     charCheck.put (c, used); 
    } 

    used.add(false); 
} 
+0

Плюс один за правильный ответ. :-) – PNS

1

Вы должны относиться к каждому ArrayList отдельно, т.е. имеют один ArrayList за Character ключ.

List<Boolean> used; 

char[] charArray = str.toCharArray(); 

for (char c : charArray) { 

    used = charCheck.get(c); // Get the list of values for this character 

    if (used == null) { // No values stored so far for this character 
     used = new ArrayList<Boolean>(); // Create a new (empty) list of values 
     charCheck.put(c, used); // Add the empty list of values to the map 
    } 

    used.add(false); // Add the value for this character to the value list 
} 

Кроме того, я предложил бы использовать HashMap вместо Hashtable:

HashMap<Character, List<Boolean>> charCheck = new HashMap<Character, List<Boolean>>(); 
+0

Есть ли причина hashmap используется над hashtable? Ive читал, что единственное различие - это небольшая производительность, потому что хеш-таблица является потокобезопасной. – Liondancer

+0

Да, но это существенная разница. Hashtable поставляется с первых дней Java, поэтому он больше не используется. Реализация HashMap также более эффективна. Другими словами: используйте HashMap. :-) – PNS

+0

сделаю босс !!! – Liondancer

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