Как проверить наличие одного и того же значения в ключах HashMap? Java
У меня есть карта "MovieCollection", в нём хранятся имена разных фильмов, количество их — 11.
HashMap<String, Integer> MovieCollection = new HashMap<String, Integer>();
У меня также есть текстовый массив "Massive", в котором хранятся названия фильмов, количество элементов — 6.
Я хочу пройтись по всем ключам карты(с помощью цикла for), и проверить, есть ли хоть какой-то ключ, который равно со своим значением с одним из элементов массива. По правде я хочу удалить все ключи со своми значениями, которые присутствуют в массиве "Massive":
String[] massive = {"History of toys", "Lion king", "Spirited Away", "The beauty and the Beast", "Bambi", "Snow White and the 7 Dwarfs"};
MovieCollection.put("History of toys", 5); //Значения — рандомные числа, они не важны
MovieCollection.put("Lion king", 8);
MovieCollection.put("Spirited Away", 12);
MovieCollection.put("The Dark Knight:", 5);
MovieCollection.put("Howl's Moving Castle:" 3);
MovieCollection.put("Darkest Hour:" 2);
MovieCollection.put("Green Mile:" 8);
MovieCollection.put("Bambi:" 2);
MovieCollection.put("The beauty and the Beast:" 2);
MovieCollection.put("Snow White and the 7 Dwarfs:" 4)
MovieCollection.put("Lucy:" 9)
Вот, что я смогла сделать:
int j = 0;
for (String key : Movie.MovieCollection.keySet()) {
if (Movie.MovieCollection.keySet().equals(massive[j++])) {
Movie.MovieCollection.remove(key);
}
}
Но так как количество фильмов в карте больше, чем элементов в массиве, то выдаётся ошибка "out of bounds".
Как мне это исправить?
Ответы (3 шт):
Делайте наоборот - идите в цикле по массиву, и для каждого элемента пробуйте его удалить из мапы:
for (String el : massive) {
Movie.MovieCollection.remove(el);
}
HashMap<String, Integer> map = new HashMap<>();
map.put("History of toys", 5); //Значения — рандомные числа, они не важны
map.put("Lion king", 8);
map.put("Spirited Away", 12);
map.put("The Dark Knight:", 5);
map.put("Howl's Moving Castle:", 3);
map.put("Darkest Hour:", 2);
map.put("Green Mile:", 8);
map.put("Bambi:", 2);
map.put("The beauty and the Beast:", 2);
map.put("Snow White and the 7 Dwarfs:", 4);
map.put("Lucy:", 9);
String[] movies = new String[] {"History of toys", "Lion king", "Spirited Away", "The beauty and the Beast", "Bambi", "Snow White and the 7 Dwarfs"};
for(String movie : movies)
for(Map.Entry<String, Integer> entry : map.entrySet())
if(movie.equalsIgnoreCase(entry.getKey())) {
map.remove(entry.getKey());
break;
}
@Test
public void filter() {
// Исходные данные
Map<String, Integer> MovieCollection = new HashMap<>();
MovieCollection.put("History of toys", 5);
MovieCollection.put("Lion king", 8);
MovieCollection.put("Spirited Away", 12);
MovieCollection.put("The Dark Knight", 5);
MovieCollection.put("Howl's Moving Castle", 3);
MovieCollection.put("Darkest Hour", 2);
MovieCollection.put("Green Mile", 8);
MovieCollection.put("Bambi", 2);
MovieCollection.put("The beauty and the Beast", 2);
MovieCollection.put("Snow White and the 7 Dwarfs", 4);
MovieCollection.put("Lucy", 9);
// Ключи, которые надо выбросить
String[] toDropArray = {"History of toys", "Lion king", "Spirited Away", "The beauty and the Beast", "Bambi", "Snow White and the 7 Dwarfs"};
List<String> toDropAsList = Arrays.asList(toDropArray); // Переводим в список ради метода List::contains
Map<String, Integer> filteredMovies = MovieCollection.entrySet() // Проходим по всем парам ключ-значение
.stream() // Преобразуем в стрим
.filter(entry -> !toDropAsList.contains(entry.getKey())) // Фильтруем от тех, чьи ключи находятся в списке toDropAsList
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); // Собираем обратно в Map
Assert.assertEquals(5, filteredMovies.size()); // Проверяем, что в полученном результате всего 5 записей
Assert.assertTrue(filteredMovies.keySet().stream().noneMatch(toDropAsList::contains)); // Проверяем, что в полувенном результате нет ключей, которые есть в toDropAsList
}