簡體   English   中英

從 ArrayList 中刪除多個數字

[英]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 表達式 它們是一個相當高級的主題,但基本上正在發生的事情是integerList中的項目。 我們正在“傳遞”對條件語句的引用,以便可以在計算中使用它。

所以它基本上是在說“對於每個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM