我正试图通过另一个列表的值将整数列表拆分为较小的数组(范围)。因此,例如,拥有一个值为
的数组[100, 10, 4000, 9, 3000, 1024, 15, 660, 999]
要分割的值数组。
[20, 300, 500, 1000, 10000]
我想要得到值小于对应值的数组。像
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?或者有什么快速的算法?
使用java8流,
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]}
您可以在groupingBy
中提供作为TreeMap
的供应商,以获得排序结果。
按键排序
Map<Integer, List<Integer>> grouped = numbers.stream().collect(Collectors.groupingBy(between, TreeMap::new, Collectors.mapping(k -> k, Collectors.toList())));
输出{20=[10, 9, 15], 300=[100], 1000=[660, 999], 10000=[4000, 3000, 1024]}
这似乎可以工作:
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);
}
唯一的问题是如何显示