Javaでのループのためにネストされた使用8

学習者:

私はループの入れ子に使っていたコードの下にあると私は休憩forループの内側、そしてこれは、このコードのパフォーマンスを改善することが、いくつかの条件があります。

public static int getMaxValue(List<Integer> list) {
    int result = -1;
    for(int i=0; i<list.size(); i++) {
        for(int j=i+1; j<list.size(); j++) {
            if(list.get(j) - list.get(i) <= 0) break;
            if(list.get(j) - list.get(i) > result) {
                result = list.get(j) - list.get(i);
            }
        }
    }
    return result;
}

今どのように私は、同じロジックを実行するためにJava 8のストリームを使用することができますか?私はコードの下に出ています。

public static int getMaxValue(List<Integer> list) {
    int[] result = { -1 };
    IntStream.range(0, list.size()).forEach(i -> {
        IntStream.range(i + 1, list.size()).forEach(j -> {
            if(list.get(j) - list.get(i) <= 0) return;

            if(list.get(j) - list.get(i) > result[0]) {
                result[0] = list.get(j) - list.get(i);
            }
        });
    });
    return result[0];
}

ここで私は使用することはできませんbreak、私が使用しているので、Javaのストリームに文をreturn文を、それはパフォーマンスが改善されない、それを壊さないように、そのそれでも、内側のループを実行します。

ダニエルPryden:

私はあなたのコードを理解していれば、あなたは入力リスト内の任意の2つの要素の間の最大のペアごとの差を検索しようとしています。あなたがそれを行うことができますIntSummaryStatistics

public static int getMaxValue(List<Integer> list) {
    IntSummaryStatistics stats = list.stream()
        .mapToInt(Integer::intValue)
        .summaryStatistics();
    return stats.getMax() - stats.getMin();
}

これはO(1)補助記憶装置とO(n)の動作です。O(n²)操作の必要はまだありません。最終的には、ループの外に破壊することは、早期の最適化ですが、1つの非常に効果的ではない-低漸近的コストとアプローチを見つけることは常になり、よりだけ早くループの外に破壊よりも効果的。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=316089&siteId=1