2013-08-25 2 views
0

Итак, у меня есть HashMap<String, String>Удалить значение из HashMap, основываясь на ключевых

public HashMap<String, String> frozen = new HashMap<String, String>(); 

, и я хочу, чтобы удалить значение из него в зависимости от ключа. Так скажем, я положил в них

frozen.put("1", "1_1"); 
frozen.put("1", "1_2"); 

Я хочу удалить только одно из значений, а не весь набор ключей.

Как мне это сделать? Если вы все еще не понимаете, этот несуществующий метод должен объяснить это.

frozen.remove("1", "1_2"); 

Очевидно, что этого не существует, но это то, что я хочу.

Заранее благодарен.

+4

ли вы пройти через API из [ 'HashMap'] (http://docs.oracle. ком/JavaSE/7/документы/API/Java/Util/HashMap.html)? –

+0

Нет, еще нет. Я совершенно новичок в Java, но прокручивал работу с набором записей, а затем устанавливал значение записи равным нулю? – user2704112

+3

После двух строк 'put', которые вы указали, ваш' HashMap' имеет ** одну ** запись в нем. Второй «put» перезаписывает значение. –

ответ

7

Похоже, что самым простым решением будет использование какого-либо типа List в качестве вашего значения. В данном конкретном случае, это может выглядеть примерно так:

final Map<String, List<String>> map = new HashMap<String, List<String>>(); 
final String key = "1"; 
map.put(key, new LinkedList<String>()); 
map.get(key).add("1_1"); 
map.get(key).add("1_2"); 

И затем, чтобы удалить значение данный конкретный ключ (как показано в вашем вопросе), вы можете попробовать что-то вроде map.get(key).remove("1_2");

+1

Спасибо, человек, пошел с вашим решением. Я должен был подумать об этом немного дальше. Также спасибо за то, что не так негативны, как все остальные - я здесь, чтобы задать вопрос. :) – user2704112

+0

Счастливые помочь. :) –

+0

@JoshM Хороший ответ ... – Satheesh

0

Что вы делаете, это невозможно. Вы не можете использовать другое значение, используя тот же ключ. Вы можете удалить запись, используя remove method, но для чего-то вы хотите проверить что-то вроде Guava's MultiMap.

Если вы действительно хотите удалить на основе значения, вам необходимо выполнить итерацию значений карты с помощью entrySet(), а затем на основе вызова значения метод remove с помощью найденного ключа.

+0

(Не мой нисходящий) Это комментарий, а не ответ. –

+0

Более того, это не отвечает на вопрос. OP, похоже, уже знает это./ –

+0

Знает это? Как вы можете сказать? Он пытается вставить две записи, что не удастся, потому что он использует ее в том же ключе. Мне непонятно, что он знает, что делает. –

0

Самый простой способ найти решение такой задачи обратиться к JavaDocs: http://docs.oracle.com/javase/7/docs/api/

Найдите свой класс там (в вашем случае: java.util.HashMap) и искать метод удаления. В этом случае вам не нужно передавать значение методу (что было бы действительно неэффективно). Чтобы удалить что-то из HashMap, просто передать ключ к методу REMOVE:

frozen.remove("1"); 

Это приведет к удалению пары ключ-значение "1", "1_2" из HashMap.

Почему это не приведет к удалению первой пары ключ-значение? Поскольку метод put перезаписывает любые предыдущие значения. Для того, чтобы иметь возможность сопоставить ключ несколько значений, попытайтесь создать HashMap с помощью строки и списка:

HashMap<String, ArrayList> frozen = new HashMap<String, ArrayList>(); 

возможный пример.

0

Вы, наверное, Код параметра put инвертирован. Повторяющиеся ключи не допускаются. Новые значения (для одного и того же ключа) заменяют старые. Таким образом,

frozen.put("1", "1_1"); 
frozen.put("1", "1_2"); 

создает карту с одной записью: key = "1" и значением = "1_2".Напротив,

frozen.put("1_1", "1"); 
frozen.put("1_2", "1"); 

создает карту с 2-мя элементами. Чтобы удалить запись, вам нужно всего лишь ссылаться на свой ключ, так как они являются уникальными:

frozen.remove("1_2"); 

Если это не звонит колокол, то, пожалуйста, более конкретно в том, что структура данных должна держать, и то, что не , Несколько вариантов использования помогут.

0

Я считаю, что вы пытаетесь сопоставить несколько строк с одним ключом. Это возможно, но если вы наберете свой ключ на List.

public Map<String, List<String>> frozen = new HashMap<String, List<String>>(); 

Затем вы можете добавить несколько значений в том же ключе, как

public void addToMappedList(Map<String, List<String>> map, 
           String key, String value) { 
    List<String> existingValues = map.get(key); 
    if (existingValues == null) { 
     existingValues = new ArrayList<String>(); 
     map.put(key, existingValues); 
    } 
    existingValues.add(value); 
} 

addToMappedList(frozen, "1", "1_1"); 
addToMappedList(frozen, "1", "1_2"); 

Вот как идти об удалении отдельных значений из List. Возвращенный boolean указывает, действительно ли был найден и удален value из List или нет.

public boolean removeFromMappedList(Map<String, List<String>> map, 
             String key, String value) { 
    List<String> existingValues = map.get(key); 
    if (existingValues != null) { 
     return existingValues.remove(value); 
    } 
    return false; 
} 

removeFromMappedList(frozen, "1", "1_1"); // true 
removeFromMappedList(frozen, "1", "1_3"); // false 

Чтобы удалить весь ключ и List связанный с ним просто использовать Map непосредственно

frozen.remove("1"); 
Смежные вопросы