2016-10-13 6 views
0

整数のリストを別のリストの値でより小さい配列(範囲)に分割しようとしています。たとえば、そのような値を持つ配列を持つ配列RxJavaを使った整数の分割リスト

[100, 10, 4000, 9, 3000, 1024, 15, 660, 999] 

そして値の配列を分割します。

[20, 300, 500, 1000, 10000] 

値を持つ配列を取得したい場合は、対応する値よりも小さい値を取得します。 Like

20 -- [9, 10, 15] // (value from first array < 20) 
300 -- [100] // (20 <= value < 300) 
500 -- [] // (300 <= value < 500) 
1000 -- [660, 999] // (500 <= value < 1000) 
10000 -- [1024, 3000, 4000] // (1000 <= value < 10000) 

RxJavaを使用してこれを実装する方法はありますか?またはそれを行うための高速アルゴリズムですか?

+2

あなたはまだ何をしようとしたことがあり、キー

Map<Integer, List<Integer>> grouped = numbers.stream().collect(Collectors.groupingBy(between, TreeMap::new, Collectors.mapping(k -> k, Collectors.toList()))); 

出力によってソートするには? – ItamarG3

+0

私はこれを実装する方法をいくつか考えています。値の配列を反復し、range配列の各要素と比較するのではなく、最適な方法で実装します。しかしこれはそれほど最適ではないようです。 – dbulgakov

+0

は多分最善の方法は、範囲のも、ソートされた配列で値のソートされたリストを比較することですが、私は今コードに – dbulgakov

答えて

2

が表示され、

List<Integer> numbers = Arrays.asList(100, 10, 4000, 9, 3000, 1024, 15, 660, 999); 
    List<Integer> range = Arrays.asList(20, 300, 500, 1000, 10000); // sorted 
    Function<Integer, Integer> between = n -> { 
     for (Integer in : range) { 
      if (in >= n) 
       return in; 
     } 
     return -1; 
    }; 
    Map<Integer, List<Integer>> grouped = numbers.stream().collect(Collectors.groupingBy(between)); 
    System.out.println(grouped); 

が出力

{10000=[4000, 3000, 1024], 20=[10, 9, 15], 1000=[660, 999], 300=[100]} 

あなたのようにサプライヤーを提供することができますTreeMapgroupingByに設定し、結果を並べ替えます。

UPDATE

{20=[10, 9, 15], 300=[100], 1000=[660, 999], 10000=[4000, 3000, 1024]} 
+0

おかげで働いている方法を使用してこのRxJava – dbulgakov

+0

@dbulgakovようこそ、ソートコードで更新された答え – Saravana

1

これは動作するようです:

public static void main(String[] args) { 
     List<Integer> list = new ArrayList<Integer>(); 
     list.add(100); 
     list.add(10); 
     list.add(4000); 
     list.add(9); 
     list.add(3000); 
     list.add(1024); 
     list.add(15); 
     list.add(660); 
     list.add(999); 
     int[] splitValues = new int[]{20,300,500,1000,10000}; 
     int prev = 0; 
     //100, 10, 4000, 9, 3000, 1024, 15, 660, 999 
     Collections.sort(list); 
     Map<Integer, Integer[]> map = new HashMap<Integer,Integer[]>(); 
     for (int i = 0; i < splitValues.length; i++) { 
      for (int j=prev;j<list.size();j++) { 
       if(splitValues[i]<list.get(j)){ 
        addRecord(map,list,j, splitValues[i],prev); 
        prev = j; 
        break; 
       } 
      } 
     } 
     System.out.println(map); 
    } 

    private static void addRecord(Map<Integer, Integer[]> map, List<Integer> list, int j, int index, int start) { 
     try { 
      list = list.subList(start, j);   
     } catch (Exception e) { 
      System.out.println("boo"); 
     } 

     Integer[] arr = new Integer[j-start]; 
     list.toArray(arr); 
     map.put(index, arr); 

    } 

唯一の問題はjava8ストリームを使用して、それを

関連する問題