発生IntStream Javaの数

goodstudent404:

私は、0〜9の数字の一覧を取り込んで、隣接する繰り返し文字の出現回数を返しますcountRepeatsという名前のメソッドを定義したいです。

例えば、

テストケース1:配列{0、1、2、2、1、2、2、1、3、3、1}を繰り返す桁の三の発生を有します

テストケース2:配列{0、1、1、1、1、2}つの存在を有しています

以下は、私のコードは次のとおりです。

List<Integer> intlist = new ArrayList<Integer>();
        int [] array = new int[]{};
        while(sc.hasNext()){
          intlist.add(sc.nextInt());
          array = intlist.stream().mapToInt(i->i).toArray();  
        }
        System.out.println("Number of occurrences: " + countRepeats(array));

public static long countRepeats(int [] array){
      return IntStream.range(0, array.length-1)
                    .filter(n -> array[n] > 0)
                    .filter(i -> (array[i] == array[i+1]))
                    .peek(System.out::println)
                    .count();
}

しかし、私は2誰もが私を啓発することができます私のテストケースのために望ましい結果を取得できませんでしたか?

トムホーティン - tackline:

我々は、我々はボクシングを避けることができる繰り返しペアは、より大きな配列の一部であるかどうかを確認してください(と、配列の末尾を確認してください)場合は、元のポスターのソリューションで構築。

import java.util.*;
import java.util.stream.*;

interface CountRepeats {
    static void main(String[] args) {
        test(0, 1, 2, 2, 1, 2, 2, 1, 3, 3, 1);
        test(0, 1, 1, 1, 1, 2);
    }
    static void test(int... digits) {
        System.err.println(
            countRepeats(digits)+": "+Arrays.toString(digits)
        );
    }
    static long countRepeats(int[] array) { 
        return IntStream.range(0, array.length-1)
            .filter(i ->
                array[i] == array[i+1] && (
                   i+2 >= array.length ||
                   array[i] != array[i+2]
                )
             )
             .count();
    }
}

これは本当にストリーム強いポイントではありません。

(この線

                   i+2 >= array.length ||

本当にする必要があります

                   i >= array.length-2 ||

原因整数オーバーフローを回避しますArrayOutOfBoundsException古い言語とその壊れ整数...)

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=168545&siteId=1
おすすめ