Поведение функции contains() и remove() для Set, которое возвращается entrySet()

У меня есть следующий код. Почему содержит & удалить возвращает ложь?

    Map<Integer, String> p = new TreeMap();
    p.put(1, "w");
    p.put(2, "x");
    p.put(3, "y");
    p.put(4, "z");
    System.out.println(p);// {1=w, 2=x, 3=y, 4=z}
    Set s = p.entrySet();
    System.out.println(s);// [1=w, 2=x, 3=y, 4=z]
    System.out.println(s.contains(1));//false
    System.out.println(s.remove(1));//false
    System.out.println(p);// {1=w, 2=x, 3=y, 4=z}
    System.out.println(s);// [1=w, 2=x, 3=y, 4=z]

1 ответ

Решение

entrySet() возвращает Set из Map.Entry экземпляров. Таким образом, ваш поиск не удается, как объекты типа Map.Entry<Integer, String> никогда не может быть равным экземплярам Integer,

Следует обратить внимание на родовые подписи, т.е.

Map<Integer, String> p = new TreeMap<>();
p.put(1, "w");
p.put(2, "x");
p.put(3, "y");
p.put(4, "z");
System.out.println(p);// {1=w, 2=x, 3=y, 4=z}

Set<Map.Entry<Integer, String>> s = p.entrySet();
System.out.println(s);// [1=w, 2=x, 3=y, 4=z]

Map.Entry<Integer, String> entry = new AbstractMap.SimpleEntry<>(1, "foo");
System.out.println(s.contains(entry)); // false (not containing {1=foo})

entry.setValue("w");
System.out.println(s.contains(entry)); // true (containing {1=w})
System.out.println(s.remove(entry));// true
System.out.println(p);// {2=x, 3=y, 4=z}
System.out.println(s);// [2=x, 3=y, 4=z]

Если вы хотите обрабатывать ключи вместо записей, вы должны использовать keySet() вместо:

Map<Integer, String> p = new TreeMap<>();
p.put(1, "w");
p.put(2, "x");
p.put(3, "y");
p.put(4, "z");
System.out.println(p);// {1=w, 2=x, 3=y, 4=z}

Set<Integer> s = p.keySet();
System.out.println(s);// [1, 2, 3, 4]

System.out.println(s.contains(1)); // true
System.out.println(s.remove(1));// true
System.out.println(p);// {2=x, 3=y, 4=z}
System.out.println(s);// [2, 3, 4]

Для полноты заметки Map 3-я коллекция просмотров values(), В зависимости от фактической операции, выбор правильного вида может значительно упростить вашу работу.

Другие вопросы по тегам