Перебор и удаление из Hashtable в Java

У меня есть Hashtable в Java, и я хочу перебрать все значения в таблице и удалить определенную пару ключ-значение во время итерации.

Как это можно сделать?


person Mohit BAnsal    schedule 28.02.2010    source источник
comment
То же самое для HashMap и других карт: stackoverflow.com/questions/46898/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 11.04.2015


Ответы (4)


Вам необходимо использовать явный java.util.Iterator для перебора набора записей Map, а не использовать расширенный синтаксис цикла For, доступный в Java 6. В следующем примере выполняется перебор Map из пар Integer, String, удаляя все записи, чей ключ Integer имеет значение null или равно 0.

Map<Integer, String> map = ...

Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();

while (it.hasNext()) {
  Map.Entry<Integer, String> entry = it.next();

  // Remove entry if key is null or equals 0.
  if (entry.getKey() == null || entry.getKey() == 0) {
    it.remove();
  }
}
person Adamski    schedule 28.02.2010
comment
У вас не может быть null ключей в Hashtable. Вот что отличает его от Map. Кроме того, вы запрашиваете Map.Entry getValue в приведенном выше коде вместо getKey. Вы не можете сделать entry.getValue() == 0, потому что значения имеют тип String. - person polygenelubricants; 28.02.2010
comment
@polygenelubricants, Map — это интерфейс, не накладывающий ограничений на null. HashMap — это реализация карты, которая не допускает пустых значений. - person Steve Kuo; 28.02.2010
comment
Я не ссылаюсь на Hashtable в своем коде и в любом случае не буду его использовать, так как он заменен HashMap (который действительно допускает нулевые ключи и значения). - person Adamski; 28.02.2010
comment
Кстати, 2 минуса?! Похоже, что некоторые люди застряли в использовании коллекций JDK 1.1 или просто не утруждают себя чтением определения API Map. - person Adamski; 28.02.2010
comment
Я упоминаю Hashtable, потому что это то, что есть у OP. А @Steve, HashMap, допускает нули (java.sun .com/javase/6/docs/api/java/util/HashMap.html). - person polygenelubricants; 28.02.2010
comment
И @Adamski, люди голосуют против, потому что код неправильный. Вы сказали, что ваш код должен удалять запись, если ключ имеет значение null или равен 0, но вместо этого вы запрашиваете entry.getValue() (который имеет тип String) вместо entry.getKey() (который имеет тип Integer). - person polygenelubricants; 28.02.2010
comment
@poly: Справедливое замечание, и спасибо, что указали на это (исправлено), но почему бы просто не добавить комментарий на этот счет, а не понизить голосование (что никому не помогает)? - person Adamski; 28.02.2010
comment
Первый комментарий в этом ответе мой, и он сказал именно это. Что касается того, почему люди голосуют против, а не комментируют, вы должны спросить их. - person polygenelubricants; 28.02.2010
comment
И, кстати, код все еще неправильный. getValue() возвращает String. Строка не может сравниваться с числом 0. - person polygenelubricants; 28.02.2010

Вы можете использовать Enumeration:

Hashtable<Integer, String> table = ...

Enumeration<Integer> enumKey = table.keys();
while(enumKey.hasMoreElements()) {
    Integer key = enumKey.nextElement();
    String val = table.get(key);
    if(key==0 && val.equals("0"))
        table.remove(key);
}
person mostar    schedule 04.09.2012
comment
Можем ли мы использовать Enumeration для HashMap? - person Senthil Kumaran; 25.02.2021

Вы можете использовать временный список удаления:

List<String> keyList = new ArrayList<String>;

for(Map.Entry<String,String> entry : hashTable){
  if(entry.getValue().equals("delete")) // replace with your own check
    keyList.add(entry.getKey());
}

for(String key : keyList){
  hashTable.remove(key);
}

Дополнительную информацию о методах Hashtable можно найти в Java API< /а>

person Scharrels    schedule 28.02.2010
comment
Вы можете сделать это, но нет необходимости использовать дополнительную коллекцию; Это только усложняет ситуацию. - person Adamski; 28.02.2010

Итак, вы знаете пару ключ-значение, которую хотите удалить заранее? Просто гораздо понятнее сделать это, тогда:

 table.delete(key);
 for (K key: table.keySet()) {
    // do whatever you need to do with the rest of the keys
 }
person polygenelubricants    schedule 28.02.2010
comment
я знал только значение, так что это не сработает. Хотя спасибо за поиск - person Mohit BAnsal; 28.02.2010