Почему этот код не дает мне желаемого результата? Поскольку мы используем хэш-карты для реализации пар ключ-значение и ключи уникальны. Таким образом, это может удалить повторяющиеся элементы из массива. Но вместо того, чтобы удалять повторяющиеся элементы, удаляются некоторые фактические элементы.

package hashmaps;

import java.util.HashMap;

public class HashMap01 {
    public static void main(String[] args) {
        int[] arr = {1,2,2,4,5,5,5,7,66,65,65};
        HashMap<Integer, Integer> map = new HashMap<>();
        for(int i=0; i<arr.length; i++){
            if(map.containsKey(arr[i])){
                map.remove(arr[i]);
            } else {
                map.put(arr[i],i);
            }
        }
        map.forEach((k,v)-> System.out.print(k+" "));
    }
}

Я хочу 1,2,4,5,7,66,65


Но получение 1,66,4,5,7

0
workfromhome 27 Сен 2022 в 21:20

2 ответа

map.remove(arr[i]); удаляет запись, и ваш код не возвращает новую запись на ее место.

Самое простое решение - просто заменить

if(map.containsKey(arr[i])){
  map.remove(arr[i]);
} else {
  map.put(arr[i],i);
}

С участием

map.put(arr[i],i);
1
Louis Wasserman 27 Сен 2022 в 21:24

В качестве дополнения к ответу Луи вам не нужна карта здесь, потому что вы не используете значение .

Просто используйте HashSet:

    HashSet<Integer> set = new HashSet<>();
    for(int i=0; i<arr.length; i++){
        set.add(arr[i]);
    }
    // Or:
    // HashSet<Integer> set = Arrays.stream(arr).boxed().collect(Collectors.toCollection(HashSet::new));
    set.forEach(k-> System.out.print(k+" "));

На самом деле способ HashSet реализован просто с использованием HashMap: значения, которые вы добавляете к Set, являются ключами карты; значение, сохраненное для каждого ключа, является некоторым произвольным значением.

Обратите внимание, что с HashSet или HashMap вы не получите надежный порядок итераций. Если вы хотите, чтобы записи отображались в порядке встречи, используйте LinkedHashSet (/LinkedHashMap).

1
Andy Turner 27 Сен 2022 в 21:33