0

以下のネストされた for ループを実行して、リスト内の各要素と、その同じリストから 1 に等しくない除数の数をストリームとしてチェックできるかどうかを調べたいと思います。もしそうなら、従来の for ループよりも推奨されますか?

サンプル入力 - 「配列 - arr」に変換された「リスト キー」。

int max = Integer.MIN_VALUE;
for(int i = 0; i < keys.size(); i++){
    int count = 0;
    for(int k = 0; k < keys.size(); k++){
        if(arr[i] % arr[k] == 0 && arr[k] != 1){
            count++;
        }
    }
    max = Math.max(max,count);
}
4

2 に答える 2

0

keysリストと配列の関係arrはあまり明確ではありません。

元のコードでは、ループはリストのサイズによる反復に基づいていますkeys(の内容keysは無視されます)。

0また、分母で除外する必要がある場合や、数値がそれ自体で除算される場合もあります。

for-loopswith インデックスは、次のように置き換えることができIntStream.range(0, keys.size())ます。

int[] divisors = IntStream.range(0, arr.length)
        .map(i -> (int) IntStream.range(0, arr.length)
                .filter(k -> arr[i] != arr[k] && arr[k] != 0 && arr[k] != 1 && arr[i] % arr[k] == 0)
                .count()
        )
        .toArray();

代わりに、配列Arrays.streamに使用して、ループのようにインデックスを無視することができます。arrforeach

int[] divisors = Arrays.stream(arr)
        .map(x -> (int) Arrays.stream(arr)
                .filter(y -> x != y && y != 0 && y != 1 && x % y == 0)
                .count()
        )
        .toArray();

int max = Arrays.stream(divisors).max().getAsInt();

System.out.println(Arrays.toString(divisors));
System.out.println(max);

テスト配列int[] arr = {6, 0, 1, 6, 2, 4, 8};の出力は次のとおりです。

[1, 5, 0, 1, 0, 1, 2]
5
于 2021-02-22T12:37:11.223 に答える