[英]Remove multiple numbers from an ArrayList
我有這個練習“編寫一個程序,構造一個包含數字 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 語句和一段時間。 但我似乎無法找到聯系。
這不是整個程序,但足以給你一個想法。 它使用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]
您可以使用模運算。
代碼:
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);
這可能比您的 class 希望您現在 go 更高級一些,但是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
沒有余數(即:它是input
的倍數),則integer % input == 0
返回true
。
給定您的代碼,輸入5
的最終 output 是這樣的:
[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 循環,在每次循環迭代時將指定的數字添加到索引中。 如果當前數字不是原始輸入數字,則將其從數組列表中刪除。
從 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);
}
}
效率不高,但最接近您的意圖且易於理解:
for (Integer i = input * 2; i <= 100; i += input) {
list.remove(i);
}
注意循環變量使用Integer
而不是int
。 remove()
方法有 2 種風格,我們不希望int
版本刪除index處的項目。
如果條件需要,可以有效地檢查它。
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.