Stream
内で計算した素数をawait for
で出力するコードをいくつか書いてみました。素数はfor(;;){}
で無限ループさせてその中で判定させ、素数だけを出力させるようにしたいと思います。
まずは、シンプルにbool判定
でループの回数を半分の位置で判定して出してみます。1
は必ず割れるので判定基準には入れません。
import 'dart:async';
// async関数内で await forかlisten()を使ってStreamの値を取り出す。async*内でyield(return)を使いStreamに値を返す。
Stream<int> primeNumberStream() async* {
for(int i = 2;;i++){
bool isPrime = true;
for(int j = 2; j <= i ~/ 2; j++){
if(i % j == 0){
isPrime = false;
break;
}
}
if(isPrime){
await Future.delayed(Duration(seconds: 1));
yield i;
}
}
}
void main() async {
await for(int p in primeNumberStream()){
print(p);
}
}
次は高速化させて3から割るパターンです。2
は予めプリントしておき、count
を設けてインクリメントで判定させます。
import 'dart:async';
Stream<int> primeNumberStream() async* {
print("2");
for (int i = 3; ; i+=2) {
int count = 0;
for (int j = 1; j < i; j++) {
if (i % j == 0) {
count++;
}
}
if (count == 1) {
await Future.delayed(Duration(seconds: 1));
yield i;
}
}
}
main() async {
await for(int p in primeNumberStream()){
print(p);
}
}
今度はcount
を取り除きfor文の中の条件式で判定させたパターンです。
import 'dart:async';
Stream<int> primeNumberStream() async* {
print("2");
for(int i = 2; ;i++){
for(int j = 3; (i % j != 0 &&
j < i) || j == i; j += 2){
if(j == i){
await Future.delayed(Duration(seconds: 1));
yield i;
}
}
}
}
void main() async {
await for(int p in primeNumberStream()){
print(p);
}
}