Advertisement
franji

Untitled

Apr 2nd, 2020
674
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.00 KB | None | 0 0
  1. package il.ac.tau.cs.franji;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Iterator;
  5. import java.util.stream.StreamSupport;
  6.  
  7. /**
  8.  * Printing N first primary numbers - several ways to do it in Java
  9.  * https://pastebin.com/tQdxerxD
  10.  */
  11. public class Primes {
  12.     public static void printNPrimesArray(int N) {
  13.         int[] primes = new int[N];
  14.         int nextIndex = 0;
  15.         int k = 1;  //starts with 2 as there is a += at loop start
  16.         while (nextIndex < N) {
  17.             k += 1;
  18.             // check if k prime
  19.             boolean isPrime = true;
  20.             for (int i = 0; i < nextIndex; i++) {
  21.                 int p = primes[i];
  22.                 if ((k % p) == 0) {
  23.                     isPrime = false;
  24.                     break;
  25.                 }
  26.             }
  27.             if (isPrime) {
  28.                 primes[nextIndex++] = k;
  29.             }
  30.         }
  31.         // now print the primes
  32.         for (int p : primes) {
  33.             System.out.println(p);
  34.         }
  35.     }
  36.  
  37.     public static void printNPrimesArrayList(int N) {
  38.         ArrayList<Integer> primes = new ArrayList<>();
  39.         int k = 1;  //starts with 2 as there is a += at loop start
  40.         while (primes.size() < N) {
  41.             k += 1;
  42.             // check if k prime
  43.             boolean isPrime = true;
  44.             for (int p : primes) {
  45.                 if ((k % p) == 0) {
  46.                     isPrime = false;
  47.                     break;
  48.                 }
  49.             }
  50.             if (isPrime) {
  51.                 primes.add(k);
  52.             }
  53.         }
  54.         // now print the primes
  55.         for (int p : primes) {
  56.             System.out.println(p);
  57.         }
  58.     }
  59.  
  60.     public static void printNPrimesStreams(int N) {
  61.         ArrayList<Integer> primes = new ArrayList<>();
  62.         int k = 1;  //starts with 2 as there is a += at loop start
  63.         while (primes.size() < N) {
  64.             k += 1;
  65.             // check if k prime
  66.             final int kk = k;
  67.             if (primes.stream().allMatch(p -> (kk % p) != 0)) {
  68.                 primes.add(k);
  69.             }
  70.         }
  71.         // now print the primes
  72.         for (int p : primes) {
  73.             System.out.println(p);
  74.         }
  75.     }
  76.  
  77.     static class PrimesIteratable implements Iterable<Integer> {
  78.         ArrayList<Integer> primes = new ArrayList<>();
  79.  
  80.         class PrimesIterator implements Iterator<Integer> {
  81.             int k = 1;
  82.  
  83.             @Override
  84.             public boolean hasNext() {
  85.                 return true;  // primes is infinite
  86.             }
  87.  
  88.             @Override
  89.             public Integer next() {
  90.                 for (; ; ) {
  91.                     this.k++;
  92.                     boolean isPrime = true;
  93.                     boolean addToPrimes = true;
  94.                     for (int p : primes) {
  95.                         if (p >= k) {
  96.                             // the primes array may have more values since it was built by another iterator
  97.                             addToPrimes = false;
  98.                             isPrime = p == k;
  99.                             break;
  100.                         }
  101.                         if ((k % p) == 0) {
  102.                             isPrime = false;
  103.                             break;
  104.                         }
  105.                     }
  106.                     if (isPrime) {
  107.                         if (addToPrimes) {
  108.                             // note - adding to parent class array - shared by all iterators
  109.                             primes.add(k);
  110.                         }
  111.                         return k;
  112.                     }
  113.                 }
  114.             }
  115.         }
  116.  
  117.         @Override
  118.         public Iterator<Integer> iterator() {
  119.             return new PrimesIterator();
  120.         }
  121.     }
  122.  
  123.  
  124.     public static void main(String[] args) {
  125.         System.out.println("--- printNPrimesArray(20) ---");
  126.         printNPrimesArray(20);
  127.         System.out.println("--- printNPrimesArrayList(20) ---");
  128.         printNPrimesArrayList(20);
  129.         System.out.println("--- printNPrimesStreams(20) ---");
  130.         printNPrimesStreams(20);
  131.  
  132.         System.out.println("--- PrimesIteratable -take 1 (30) ---");
  133.         // primesIter is an infinite list of primes you can iterate over.
  134.         PrimesIteratable primesIter = new PrimesIteratable();
  135.         int i = 0;
  136.         for (int p : primesIter) {
  137.             System.out.println(p);
  138.             if (i++ >= 30) {
  139.                 break;
  140.             }
  141.         }
  142.         System.out.println("--- PrimesIteratable -take 2 (20) ---");
  143.         // Using the same iterable again - primes array inside it is already initialized
  144.         i = 0;
  145.         for (int p : primesIter) {
  146.             System.out.println(p);
  147.             if (i++ >= 20) {
  148.                 break;
  149.             }
  150.         }
  151.         System.out.println("--- PrimesIteratable -convert to stream limit(20) ---");
  152.         StreamSupport.stream(primesIter.spliterator(), false).limit(20).forEach(p -> System.out.println(p));
  153.     }
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement