2015-08-13 2 views
2

Я хочу удалить определенное значение из hashmap и ключ от этого значения. Посмотрите, например, если у меня естьУдаление из hashmap определенного значения и ключа

hashMap.put(cold, frozen) 
hashMap.put(cold,hard) 

, в моем графическом интерфейсе у меня будет cold=[frozen,hard] .Если я хочу стереть hard Я хочу cold = [frozen] остаться

Моя HashMap является private HashMap<String,ArrayList<String>> hashMap ; Вот что я пытался, но это не достаточно хорошо, потому что если у меня есть в 2-х различном ключе значения, которое я хочу, чтобы удалить, она только удаляет значение для первого, и если у меня есть для экс cold=[frozen,hard] и стирают трудно Безразлично, т держать cold=[frozen];

for(String key : hashMap.keySet()){ 
    int siz = hashMap.get(key).size(); 
    for(int i = 0; i< siz;i++){ 

     if(hashMap.get(key).get(i).equals(cuvant)){ 
      s.remove(hashMap.get(key).get(i)); 
      siz--; 
      hashMap.remove(key); 

     } 
    } 
} 

Я забыл упомянуть, что s является списком arrayList со значениями.

+0

Просто небольшой намек: Вы можете объявить карту как 'Map > hashMap' - если это возможно, вы должны всегда программа против интерфейсы, а не реализации. – Alex

+1

что '' 'в' s.remove (hashMap.get (key) .get (i)); '? – vefthym

+0

Извините, я забыл упомянуть. Является ли массив, содержащий значения. –

ответ

-1

Попробуйте это: -

 HashMap<String, ArrayList<String>> m = new HashMap<>(); 
     Iterator<Map.Entry<String,ArrayList<String>>> iter = m.entrySet().iterator(); 
     while (iter.hasNext()) { 
      Map.Entry<String,ArrayList<String>> entry = iter.next(); 
      ArrayList<String> list = entry.getValue(); 
      for(int i = 0 ; i < list.size() ; i++){ 
       if(list.get(i).equals(cuvant)){ 
        list.remove(i); 
       } 
      } 
      if(list.isEmpty()) 
       iter.remove(); 
     } 
+0

Это не так, если я увидел этот ответ, я бы назвал его. Во всяком случае, я обновлю ответ, чтобы соответствовать arraylist строк –

+0

@vefthym Я думаю, что это должно сделать это –

+0

Это он. Я избегал итератора и hasNext(), потому что я не очень популярен с этими условиями. Большое спасибо ! –

0

добавить условие

if (hashMap.get(key).isEmpty()) 

перед тем

hashMap.remove(key); 

Это позволит вам удалить ключ, только если список, связанный с ним совершенно пуст.


Кроме того, убедитесь, что вы не держите итерации (внутренний контур) после удаления элемента из списка, если вы используете для-каждого цикла, он получит вам ConcurrentModificationException. Если ваш список может иметь одно и то же значение несколько раз (и его следует удалить несколько раз), используйте API Iterator, а не цикл for-each.

+1

Это не отвечает на его вопрос. На его карте у него есть список с N значениями, и он хочет удалить ОДИН из этих значений, чтобы после этого список с значениями N-1 оставался. –

+0

@BobbyStJacques Да, да. Вы удаляете значение (как это делает исходный код), и он полностью удаляет список с карты после него. Я ответил, как избежать нежелательной части и сохранить список с N-1 значениями. – amit

+0

Да, я получил это исключение. Но я не знаю об итераторе API. Я буду искать его –

2

Вы положить ArrayList со значениями в HashMap?

Если да, то проверьте размер списка первого:

if (! hashMap.get(key).isEmpty()){ 
      hashMap.get(key).remove(ValueToRemoved) 
} 
Смежные вопросы