从ArrayList中删除多个数字

问题描述 投票:0回答:7

我有这个练习:

编写一个程序,构造一个包含数字 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 语句一段时间。但我似乎找不到联系。

java arrays loops arraylist
7个回答
1
投票

您可以使用模运算

代码:

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

1
投票

这不是整个程序,但足以让您了解。 它使用

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]

1
投票

这可能比您的班级现在希望您进行的操作要高级一些,但是

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]

0
投票

效率不高,但最接近你的意图并且易于理解:

for (Integer i = input * 2; i <= 100; i += input) {
    list.remove(i);
}

注意循环变量使用

Integer
而不是
int
remove()
方法有 2 种风格,我们不想要
int
版本,它会删除 index 处的项目。


0
投票

删除给定数字的所有倍数。创建一个从 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);
    }
}

0
投票

如果需要条件,可以有效地检查它。

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

0
投票

我发现下面的方法更简单:

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);
    }
© www.soinside.com 2019 - 2024. All rights reserved.