我有一项家庭作业,需要我编写一个方法,给定一个列表,该方法将删除3的所有倍数,并添加4、5和6的前5个倍数。然后将其添加到HashSet中,删除重复的整数,并返回HashSet的大小。
我已经弄清楚此问题中的所有其他内容,除了“添加4、5和6的前5个倍数”。我当前的代码是我坚持使用的代码,使用for循环从1迭代到30。但是,给定一个空列表,这将增加28,这是4的7倍。我尝试了嵌套循环,所以我尝试了可以迭代到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();
而不是计数到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);
}
我重写了整个方法并进行了一些更改:
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