почему я получаю дубликаты в своем списке после использования метода containsKey

#java #list #dictionary #arraylist #hashmap

#java #Список #словарь #arraylist #hashmap

Вопрос:

я использую hashmap для проверки того, что на карте существует значение ключа, и добавляю ключ в список, который я использую containsKey для предотвращения дублирования, но он добавляет дубликат в мой список

  private static  void makeList(int n,ArrayList<Integer> minimum ,HashMap<Integer,Integer> ugly) {
        for(int i=1; minimum.size() < n;   i) {
           
            if(!ugly.containsKey(2*i)); {
            minimum.add(2*i);
            ugly.put(2*i,2*i );
            }
            int m3=3*i; 
            if(!ugly.containsKey(3*i)){
            minimum.add(3*i);
             ugly.put(3*i,3*i);   
            }
            int m5=5*i;
            if(!ugly.containsKey(m5)){
           minimum.add(m5);
           ugly.put(m5,m5);
            }
            
            
        }
            
    } 
  

Ответ №1:

Я вижу, что вы указали точку с запятой ; после if() условия

просто удалите это и попробуйте

  private static  void makeList(int n,ArrayList<Integer> minimum ,HashMap<Integer,Integer> ugly) {
        for(int i=1; minimum.size() < n;   i) {
           
            if(!ugly.containsKey(2*i)) { //<-edited part, removed semicolon
            minimum.add(2*i);
            ugly.put(2*i,2*i );
            }
            int m3=3*i; 
            if(!ugly.containsKey(3*i)){
            minimum.add(3*i);
             ugly.put(3*i,3*i);   
            }
            int m5=5*i;
            if(!ugly.containsKey(m5)){
           minimum.add(m5);
           ugly.put(m5,m5);
            }
            
            
        }
            
  

Ответ №2:

Будьте просты, и это очистит код.

 private static  void makeList(int n, List<Integer> minimum, Map<Integer,Integer> ugly) {
    for (int i = 1; minimum.size() < n; i  )
        for (int j : Arrays.asList(2, 3, 5))
            if(ugly.put(i * j, i * j) == null)
                minimum.add(i * j);
}
  

PS Почему бы вам не использовать Set<Integer> вместо Map<Integer, Integer> with key == value ?