2017-12-29 12 views
1

ストリーム上で次の操作を連続して実行します。Java APIストリームを使用してそのような操作を実行する方法は?

1)。 2からnまでの数字のストリームを作成したいと思います。

これは次のようになります。IntStream.range(2, n)

2)。この番号が既にこのフィルタを通過した他の番号で割り切れない場合にのみ、さらに数字を進めるフィルタを追加します。

このようなフィルタを実装するのに問題があります。私はArrayListを含む匿名クラスを作成しなければならないと思うし、このフィルタを通過したすべての数値をこのArrayListに保存します。すべては次のようになります。

IntStream.range(2, n).filter(new IntPredicate() { 
     ArrayList<Integer> prev; 

     @Override 
     public boolean test(int value) { 
      if (prev == null) { 
       prev = new ArrayList(); 
       return true; 
      } 
      for (int i = 0; i < prev.size(); i++) { 
       if (value % prev.get(i) == 0) { 
        return false; 
       } 
      } 
      prev.add(value); 
      return true; 
     } 

3)。 Map<Integer, Integer>を取得します。ここで、キーは数百(つまり100,200,300,400など)で、valueは各100の素数の数です。だから百に対して100私は[100,199]の範囲の素数の数を見つけなければなりません。

2番目のステップの後にストリームに残っている素数だけがあることは明らかですね。しかし、私は3番目のステップを実行する方法を知りませんし、2番目のステップの実装についてはわかりません。

すべての操作を正しく適用できますか?

+2

ストリームはこれにあまり適していません。実際には仕事に適したツールではありません。 –

答えて

5

あなたは(あなたが簡単にオンライン実装を見つけることができます)メソッドisPrime(int)を持っていると仮定すると、ここにあるどのようにグループ化できます結果:

IntStream.range(2, n) 
     .filter(i -> isPrime(i)) 
     .boxed() 
     .collect(Collectors.groupingBy(i -> i/100 * 100, 
       Collectors.summingInt(i -> 1))) 
+1

*この番号が既にこのフィルタを通過した他の番号で割り切れない場合は、この答えは解決できません。私は、OPがその問題を(あいまいではなく)正確に特定できないことを理解しています。 –

+0

@ Jean-BaptisteYunèsそれはちょうど素数を意味します。どうしたの? – shmosel

+0

入力が2からnまでの整数の範囲でない場合、彼の仕様は素数を定義しません。 –

1

私はあなたのコードを変更するビットので、あなたがループ内で前のヌルをチェックすると、間違ったIntStreamを取得します。

コードを実行して結果を確認できます。

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.function.IntPredicate; 
import java.util.function.Supplier; 
import java.util.stream.IntStream; 

public class StreamAPI { 

    public static void main(String[] args) { 

     int n = 1000; 
     Supplier<IntStream> intStreamSupplier =() -> IntStream.range(2, n).filter(new IntPredicate() { 

      ArrayList<Integer> prev = new ArrayList<>(); 

      @Override 
      public boolean test(int value) { 

       for (int i = 0; i < prev.size(); i++) 
       { 
        if (value % prev.get(i) == 0) 
        { 
         return false; 
        } 
       } 
       prev.add(value); 
       return true; 
      } 
     }); 

     Map<Integer, IntStream> map = new HashMap<>(); 

     for (int i = 0; i < n; i += 100) 
     { 
      int j = i; 
      IntStream subStream = intStreamSupplier.get().filter(new IntPredicate() { 

       @Override public boolean test(int value) { 

        if (j < value && value < (j + 100)) 
        { 
         return true; 
        } 
        return false; 
       } 
      }); 

      map.put(i, subStream); 
     } 

     for (Map.Entry<Integer, IntStream> entry : map.entrySet()) 
     { 
      Integer key = entry.getKey(); 
      IntStream value = entry.getValue(); 

      System.out.println("key: " + key); 
      int[] arr = value.toArray(); 
      for (int i = 0; i < arr.length; i++) 
      { 
       System.out.println(arr[i]); 
      } 
     } 
    } 
} 
関連する問題