2017-04-14 54 views
0

考慮我有一個從1到10排序的數字的數組。 我想根據關鍵元素拆分數組。 對於說:最有效的方法來拆分排序的數組周圍的一個鍵

Key Transformed Array 
    1 [2-10] 
    5 [2-4],[6-10] 
    6 [2-4],[7-10] 
    7 [2-4],[8-10] 
    8 [2-4],[9-10] 
    10 [2-4],[9-9] 

我不打算如果鍵是連續的, 含義做迭代,

Keys 5,6,7 and 8 have to be processed in one step breaking 
[2-4],[6-10] into [2-4],[9-10] 
+0

您的問題陳述不明確。另外,你到目前爲止嘗試過什麼?,請張貼也。 –

+0

更具體地說,我在列表(A)中有一系列連續的數字。 我也有一個列表(B)的數字從列表中刪除。刪除列表(A)之間的數字應該導致列表(A)被拆分成兩個較小的列表,並刪除一個在列表的開始或結尾應該縮小列表的數字。我在數據庫中有這些數字,並且我計劃在Java層中進行這種計算,因爲它是用SQL來完成的。 –

回答

0

最簡單的辦法是使用Collectors.partitioningBy方法與Java 8的StreamsCollectors沿。

import java.util.stream.Collectors; 
import java.util.Map; 
import java.util.List; 
import java.util.Arrays; 

public class Partition { 

    public static String join(int[] a, String d) { 
     return Arrays.stream(a).mapToObj(String::valueOf) 
        .collect(Collectors.joining(d)); 
    } 

    public static void main(String[] args) { 
     int[] v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 
     int k = 4; 
     Map<Boolean, List<Integer>> partitions = Arrays.stream(v) 
      .boxed() 
      .filter(n -> n != k) 
      .collect(Collectors.partitioningBy(n -> n < k)); 

     int[] vlt = partitions.get(true).stream() 
           .mapToInt(Integer::intValue).toArray(); 
     int[] vgt = partitions.get(false).stream() 
           .mapToInt(Integer::intValue).toArray(); 

     System.out.println("vlt: {" + join(vlt, ", ") + "}"); 
     System.out.println("vgt: {" + join(vgt, ", ") + "}"); 
    } 

} 

在一個側面說明,我個人只想用List<Integer>代替int[]並跳過轉換,如果這是一個選項。

+0

我會試試這個 –

+0

把它清理一下。 – tep

+0

感謝您的解決方案。 –

相關問題