【问题标题】:Remove multiple numbers from an ArrayList从 ArrayList 中删除多个数字
【发布时间】:2021-06-08 15:10:07
【问题描述】:

我有这个练习“编写一个程序,构造一个包含数字 1 到 100 的 ArrayList 并将它们打印出来。然后向用户询问一个数字,并删除该数字的所有倍数(除了number 本身)从列表中,并再次打印列表。例如,如果用户选择 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 语句和一段时间。但我似乎找不到联系。

【问题讨论】:

  • 问问自己如何获得给定数字的所有倍数。您知道您的列表是从1100。所以......如果用户输入5,你如何得到1100之间的所有5的倍数?当你得到它时,你只需要做list.remove(multiple); 就可以了。试着用简单的话来描述它,一步一步来。然后你会发现你可以很容易地将这些步骤转换成代码。
  • 是的。我只是学习的“基本”练习。
  • 将查看所有内容。谢谢你。 @BenjaminM,好点。将尝试逐步查看

标签: java arrays loops arraylist


【解决方案1】:

您可以使用modulo operation

代码:

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

【讨论】:

  • 这也将删除input 本身。
  • @Alex 是的,我修好了。谢谢。
  • 投票赞成,专门用于为结果创建新列表。在循环中修改初始列表是一个坏主意。此任务还有一个额外的问题:列表包含整数。因此,list.remove(7) 的作用可能一目了然 - 删除第七个元素或删除值为 7 的元素。因此,创建另一个列表是一种正确的方法。
  • 啊,是的,是的,条件应该是if (list.get(i) == input || (list.get(i) % input) &gt; 0) {,然后你应该做result.add(list.get(i))。但这个想法是可靠的
  • 你好,我现在测试了它,我修正了我的错误。谢谢大家的cmets!
【解决方案2】:

这不是整个程序,但足以为您提供想法。它使用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]

【讨论】:

  • 欣赏输入。但是我没有得到“a -> a”?尚未使用 removeIf
  • 对于列表a 中的任何值,将a 应用于条件。这是一个 lambda 表达式。
  • 我看到我们提出了基本相同的解决方案。诚然,我的写作时间比你的要长。 :)
  • 在java 9中引入
  • @Zephyr Java 已经在 J​​DK 15 上,所以我不会向那些可能一直在运行 JDK 1.4 的人警告泛型(来自 JDK 1.5)。它对解决方案不是必需的。只是一种初始化列表的方法。
【解决方案3】:

这可能比你的班级希望你现在去的要高级一点,但是List 接口提供了一个removeIf() 方法,允许你删除List 中匹配特定条件的所有元素。

由于您要删除所有输入的倍数的数字,您只需使用模运算符进行检查:%

我们添加了第二个条件来说明原始input,因此它也不会被删除:

list.removeIf(integer -> (integer % input == 0 && integer != input));

奇怪的语法 (integer -&gt;) 就是所谓的 lambda 表达式。它们是一个相当高级的主题,但基本上正在发生的事情是integerList 中的项目。我们正在“传递”对条件语句的引用,以便在计算中使用它。

所以它基本上是说“对于每个integer,都这样做-&gt;。” Lambda 是 Java 的一项功能,可让您编写更清晰、更易读的代码。如果您愿意,它们是更长代码的“捷径”。

这是完全相同的过程,但没有使用 lambda 快捷方式写出来:

list.removeIf(new Predicate<Integer>() {
    @Override
    public boolean test(Integer integer) {
         return integer % input == 0 && integer != input;
    }
});

如果integer ÷ input 没有余数(即:它是input 的倍数),则integer % input == 0 返回true

根据您的代码,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]

【讨论】:

  • 感谢您的意见。到目前为止还没有了解 removeIf 。我不明白整数 -> 部分。需要解释一下吗?
  • 我已经用一点解释更新了我的问题。 Lambda 是一个更复杂的主题,但它们非常有用。
  • 非常感谢您的解释。我认为这对我自己来说可能太先进了。但这是一个不错的捷径!
【解决方案4】:

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

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

注意循环变量使用Integer 而不是intremove() 方法有 2 种风格,我们不希望 int 版本删除 index 处的项目。

【讨论】:

  • 还是点赞,从一开始就喜欢
  • @user15358848 根据我的回答,效率不高,但很简单,可以完成工作。
  • 我个人认为这是一个非常聪明的解决方案,我喜欢它,真的,而且我还没有喝醉(还)
【解决方案5】:

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

【讨论】:

  • 这段代码有很多问题。它以错误的索引(零)开始,动态修改列表并可以轻松生成 IndexOutOfBoundsException。
  • @user15358848 循环一直持续到 100,但元素正在从列表中删除,因此列表的大小减小了,所以很可能最后我们会尝试删除索引小于 100 但大于当前列表大小的元素,这将导致 IndexOutOfBounds 异常。
  • 不,不会。当我们从列表中删除一个元素时,所有其他元素都向下移动 1。因此,如果 input = 5,我们将删除元素 11、17、23、29 等。您需要将 index += input 替换为 index += input - 1。所以这就是为什么我说代码有很多问题
  • 不,输入 5 的“错误值”是“10, 15, 20, 25,...”,而不是“11, 17, 23, 29,...”
  • 这里的思路和here基本一致,只是其他的答案更短更简洁。
【解决方案6】:

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

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

【讨论】:

  • 已编辑现在可以查看
猜你喜欢
  • 2013-08-31
  • 2011-06-24
  • 2016-02-14
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 2014-05-17
相关资源
最近更新 更多