Как мне найти первые 5 кратных 4, 5 и 6 и добавить их в ArrayList? - PullRequest
1 голос
/ 01 мая 2020

У меня есть домашнее задание, которое требует от меня написания метода, который при наличии списка удалит все кратные 3 и добавит первые 5 кратных 4, 5 и 6. Затем он добавит этот список в HashSet. удаляя дублирующиеся целые числа и возвращая размер HashSet.

Я разобрался со всем остальным в этой задаче, кроме «добавьте первые 5 кратных 4, 5 и 6». Мой текущий код - тот, с которым я застрял, использующий для l oop для итерации от 1 до 30. Однако, учитывая пустой список, это добавляет 28, что является 7-м кратным 4. Я пробовал вложение циклы, так что я могу повторить до 30, в то же время итерации до 5, но ни одна из моих попыток не сработала. Кто-нибудь может мне помочь?

Ниже мой текущий код.

public static int modify(List<Integer> list) {
    for (int i = 0; i < list.size(); i++) {
        if (list.get(i) == null) {
            throw new IllegalArgumentException("Cannot be null.");
        }
        if (list.get(i) % 3 == 0) {
            list.remove(i);
        }
    }

    for (int i = 1; i <= 30; i++) {
        if (i % 4 == 0) {
            list.add(i);
        }
        if (i % 5 == 0) {
            list.add(i);
        }
        if (i % 6 == 0) {
            list.add(i);
        }
    }

    Collections.sort(list);
    HashSet<Integer> unique = new HashSet<Integer>();
    unique.addAll(list);
    return unique.size();
}

Ответы [ 3 ]

1 голос
/ 01 мая 2020

Вместо того, чтобы считать до 30 и проверять наличие кратных 4, 5 и 6, почему бы вам не найти кратные значения напрямую?

for (int i = 1; i <= 5; i++) {
    list.add(4 * i);
    list.add(5 * i);
    list.add(6 * i);
}

Если есть дубликаты, они будут быть удаленным при добавлении их в HashSet.

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

0 голосов
/ 01 мая 2020

Я переписал весь метод, внеся некоторые изменения:

  1. Таким образом, удаление частей, кратных 3, более эффективно. Я использовал очень полезный метод removeIf () .
  2. Я написал решение вашей проблемы, идентичное другим ответам.

CODE

public static void main(String[] args) {
     List<Integer> list = new LinkedList<>();
     for (int i = 0; i < 30; i++) {
         list.add(i);
     }
     System.out.println(modify(list));
}

public static int modify(List<Integer> list) {
    list.removeIf(n -> (n % 3 == 0));
    for (int i = 1; i < 6; i++) {
        list.add(4 * i);
        list.add(5 * i);
        list.add(6 * i);
    }
    Collections.sort(list);
    HashSet<Integer> unique = new HashSet<>(list);
    System.out.println(unique.toString()); // You can delete this
    return unique.size();
}

ВЫХОД

[1, 2, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 28, 29, 30]

26
0 голосов
/ 01 мая 2020

Я предполагаю, что вы ожидаете, что результат передачи в пустом списке будет:

unique = [4, 5, 6, 8, 10, 12, 15, 16, 18, 20, 24, 25, 30]
size = 13

С вашими текущими логами c, ничто не помешает ему добавить множители, которые больше чем 5 (например, 7-е кратное 4), вы просто продолжаете, пока не наберете 30 в l oop. Вместо этого я мог бы порекомендовать иметь ваше значение для l oop go 1-5, а затем умножить его на множитель, который вы хотите умножить. то есть:

        // add the first 5 multiples of 4,5,6 to the list
        for (int i = 1; i < 6; i++) {
            list.add(i*4);
            list.add(i*5);
            list.add(i*6);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...