天天看點

Java Arrays類方法

1:概述

主要談一談 Java使用fork/koin類 實作的并發排序 以及對于Stream流的支援的splitetor

  • mismatch()   ->  尋找兩個數組 第一次出現資料不一緻的下标
  • parallelPrefix() -> 對數組進行,累加求和
  • parallelSetAll() -> 對數組進行置數,
  • parallelSort()   -> 并行排序
  • Spliterator() -> 對數組進行切分(切分後的資料為所有的資料的組合)
  • 奇數 x/2+1     11->6
  • 偶數  x/2    10 ==>5
public class Use_Arrays {
      
    @Test
    public void test_mismatch() {
        int []x =new int[] {1,2,3,4};
        int []y =new int[] {1,3,4,5};
        int index = Arrays.mismatch(x, y);
        System.out.println(index);
    }
    
    @Test
    public void test_parallelPrefix() {
        int []x =new int[] {1,2,3,4};
        //f2=f1+f2
        //f3=f2+f3
        Arrays.parallelPrefix(x, (k,v)->k+v);
        System.out.println(Arrays.toString(x));
        
        // 實作1-100累加求和
        int []y =new int[100];
        Arrays.parallelSetAll(y, k->k=1);
        Arrays.parallelPrefix(y, (k,v)->k+v);
        System.out.println(Arrays.toString(y));
        
    }
    @Test
    public void test_parallelSetAll() {
        int []x =new int[100];
        x[0]=1;
        Arrays.parallelSetAll(x, y->y+1);
        System.out.println(Arrays.toString(x));
    }
    
    @Test
    public void test_parallSort() {
          IntStream stream = new Random().ints(0, 1000).limit(1000);
          int[] array = stream.toArray();
          System.out.println(Arrays.toString(array));
          Arrays.parallelSort(array);
          System.out.println(Arrays.toString(array));
    }
    
    @Test
    public void test_spliterator() {
        int []x =new int[11];
        Arrays.parallelSetAll(x, k->k+=1);
        System.out.println(Arrays.toString(x));
        
        Spliterator.OfInt int0_100 = Arrays.spliterator(x);
        
        int [] y=new int[(int) int0_100.estimateSize()];
        int i=0;
        System.out.println(int0_100.estimateSize());
        System.out.println(int0_100.characteristics());
        System.out.println(int0_100.getExactSizeIfKnown());
        
        //spliterator.forEachRemaining((int k)->System.out.println(k));
        
        OfInt int1_50 = int0_100.trySplit();
        OfInt int2_25 = int1_50.trySplit();
        int0_100.forEachRemaining((int k)->System.out.print(k+" "));
        System.out.println();
        int1_50.forEachRemaining((int k)->System.out.print(k+" "));
        System.out.println();
        int2_25.forEachRemaining((int k)->System.out.print(k+" "));
    }
}      

2:使用Spliterator實作并行輸出

@Test
    public void definied_Sort() {
         IntStream stream = new Random().ints(0, 100).limit(100);
         int[] array = stream.toArray();
         Arrays.sort(array);
         final int NUMS=3;// 切分的次數
         
         ExecutorService thread_pool = Executors.newFixedThreadPool(10);
         
         Spliterator.OfInt cut1 = Arrays.spliterator(array);
         while(!thread_pool.isTerminated()) {
             thread_pool.submit(()->{
                    OfInt split = cut1.trySplit();
                     thread_pool.shutdown();
                 split.forEachRemaining((int k)->System.out.print(k+" "));
                 System.out.println();
             });
         }
    }