我如何找到 4、5 和 6 的前 5 个倍数并将它们添加到 ArrayList?

How would I find the first 5 multiples of 4, 5, and 6 and add them to an ArrayList?

我有一个家庭作业需要我编写一个方法,给定一个列表,将删除所有 3 的倍数并添加 4、5 和 6 的前 5 个倍数。然后它将那个列表添加到一个 HashSet,删除重复的整数,以及 return HashSet 的大小。

除了 "add first 5 multiples of 4, 5, and 6",我已经解决了这个问题中的所有其他问题。我当前的代码是我坚持使用的代码,使用 for 循环从 1 迭代到 30。但是,给定一个空列表,这会添加 28,这是 4 的第 7 个倍数。我尝试了嵌套循环,所以我可以迭代到 30,同时迭代到 5,但我的 none 次尝试都奏效了。谁能帮帮我?

下面是我当前的代码。

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();
}

与其数到 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 之前对列表进行排序。集合本质上没有顺序,所以列表是否排序并不重要。

我假设您希望传递空列表的输出为:

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

根据您当前的逻辑,没有什么可以阻止它添加大于 5 的倍数(例如,4 的第 7 个倍数),您只需继续,直到在循环中达到 30。相反,我可能建议让您的 for 循环变为 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);
        }

我重写了整个方法并做了一些改动:

  1. 这样去除3的倍数部分效率更高。我 使用了非常有用的removeIf()方法。
  2. 我写了你的问题的解决方案,与另一个相同 答案。

代码

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