我有这个练习:
编写一个程序,构造一个包含数字 1 到 100 的 ArrayList 并将其打印出来。然后向用户询问一个号码,并从列表中删除该号码的所有倍数(号码本身除外),然后再次打印列表。例如,如果用户选择 5,则会从列表中删除 10、15、20、25、30 等。
我似乎无法完成第二部分(删除所有倍数)
到目前为止,这就是我所得到的:
package ArrayList1To100;
import java.util.ArrayList;
import java.util.Scanner;
public class OneToHundreed {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArrayList<Integer> list = new ArrayList<>();
for (int i = 1; i <= 100; i++) {
list.add(i);
}
System.out.println(list);
System.out.println("Next part of the exercise\n_________________________");
System.out.println("Please enter a number");
final int input = sc.nextInt();
int i = 2;
int x = i * input;
while (list.contains(x)) {
list.remove(x - 1);
}
System.out.println(list);
}
}
我发现我的删除部分有缺陷,因为它只删除了一个数字。 我尝试过使用 if 语句一段时间。但我似乎找不到联系。
您可以使用模运算。
代码:
System.out.println(list);
System.out.println("Next part of the exercise\n_________________________");
System.out.println("Please enter a number");
final int input = sc.nextInt();
// The result array that will contain correct numbers.
ArrayList<Integer> result = new ArrayList<>();
// For loop roams the initial dataset starting from first index.
for (int i = 0; i < list.size(); i++) {
// If the element in the initial array list is equal to
// the input number, it will directly added to the result
// array list.
if (list.get(i) == input) {
result.add(list.get(i));
}
// Otherwise, the modulo operation will be executed.
// If the result of the modulo is greater than 0,
// the number will be added to the result array list.
else if ((list.get(i) % input) > 0) {
result.add(list.get(i));
}
}
System.out.println(result);
这不是整个程序,但足以让您了解。 它使用
removeIf
,条件是该数字可以被输入整除,但不等于输入本身。
int input = 2;
List<Integer> list = new ArrayList<>(List.of(1,2,3,4,5,6,7,8,9,10));
System.out.println(list);
list.removeIf(a->a != input && a % input == 0);
System.out.println(list);
打印
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 5, 7, 9]
这可能比您的班级现在希望您进行的操作要高级一些,但是
List
接口提供了 removeIf()
方法,允许您删除 List
中匹配特定条件的所有元素。
由于您想删除输入的倍数的所有数字,因此您只需使用模运算符来检查:
%
。
我们添加了第二个条件来解释原始的
input
,因此它也不会被删除:
list.removeIf(integer -> (integer % input == 0 && integer != input));
奇怪的语法 (
integer ->
) 就是所谓的 lambda 表达式。它们是一个相当高级的主题,但本质上正在发生的是 integer
是 List
中的项目。我们“传递”对我们的条件语句的引用,以便它可以在计算中使用。
所以它基本上是说“对于每个
integer
,执行此->
。” Lambda 是 Java 的一项功能,可让您编写更简洁、更具可读性的代码。 如果你愿意的话,它们是更长代码的“捷径”。
这是完全相同的过程,但没有使用 lambda 快捷方式编写:
list.removeIf(new Predicate<Integer>() {
@Override
public boolean test(Integer integer) {
return integer % input == 0 && integer != input;
}
});
如果
integer % input == 0
没有余数(即:它是 true
的倍数),则 integer ÷ input
返回 input
。
根据您的代码,我们对
5
输入的最终输出是这样的:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19, 21, 22, 23, 24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44, 46, 47, 48, 49, 51, 52, 53, 54, 56, 57, 58, 59, 61, 62, 63, 64, 66, 67, 68, 69, 71, 72, 73, 74, 76, 77, 78, 79, 81, 82, 83, 84, 86, 87, 88, 89, 91, 92, 93, 94, 96, 97, 98, 99]
效率不高,但最接近你的意图并且易于理解:
for (Integer i = input * 2; i <= 100; i += input) {
list.remove(i);
}
注意循环变量使用
Integer
而不是 int
。 remove()
方法有 2 种风格,我们不想要 int
版本,它会删除 index 处的项目。
删除给定数字的所有倍数。创建一个从 0 开始的 for 循环,在每次循环迭代时将指定的数字添加到索引中。如果当前数字不是原始输入数字,则将其从数组列表中删除。
从 ArrayList 中删除元素时,被删除元素之后的所有元素的索引都会向下移动 1。为了解决这个问题,我们将当前索引除以输入值(将删除其所有乘积的值),指示已删除了多少其他值。
package test;
import java.util.ArrayList;
import java.util.Scanner;
public class OneToHundreed {
public static void main(String[] args) {
Scanner sc = new Scanner(System. in );
ArrayList < Integer > list = new ArrayList < >();
for (int i = 1; i <= 100; i++) {
list.add(i);
}
System.out.println(list);
System.out.println("Next part of the exercise\n_________________________");
System.out.println("Please enter a number");
final int input = sc.nextInt();
// index = 0
// if the input is 5, the index will go like:
// 0, 5, 10, 15, 20, 25... etc
// if the index is 5, it won't remove the number
// otherwise it will
for (int index = input; index <= 100; index += input) {
if (index != input) list.remove(index - (index / input) + 1);
}
System.out.println(list);
}
}
如果需要条件,可以有效地检查它。
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArrayList<Integer> list = new ArrayList<>();
ArrayList<Integer> res = new ArrayList<>();
for (int i = 1; i <= 100; i++) {
list.add(i);
}
System.out.println("Please enter a number");
final int input = sc.nextInt();
for (int i = input; i <= 100; i += input) {
res.add(i);
}
System.out.println(res);
}
我发现下面的方法更简单:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArrayList<Integer> list = new ArrayList<>();
for (int i = 1; i <= 100; i++) {
list.add(i);
}
System.out.println(list);
System.out.println("Next part of the exercise\n_________________________");
System.out.println("Please enter a number");
final int input = sc.nextInt();
for(int i=0; i<list.size(); i++){
//if element is multiple of input
if(list.get(i)%input==0){
//remove the element
list.remove(i);
//reduce iteration, so it checks the next element -> as comes to removed element position
i--;
}
}
System.out.println(list);
}