Java 数据分组问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 数据分组问题相关的知识,希望对你有一定的参考价值。
如:1,2,3,4,5当我输入分组数3,则输出所有可能的分组(注,原始数组的数字不一定是连续的这里只是为了方便,举的特例。原始数组没有重复数字。):
1,2,3,4,5
1,2,3,4,5
1,2,3,4,,5
1,2,3,4,5
1,2,3,4,5....
分组:
以三组为例,表示所有的数字的状态是 0组,1组 ,2组 三种可能性。
循环0到(3的5次方-1),
把循环数换成三进制。
根据位数的值确定组 (例如 11 可以转成 00102 ,表示 1,2,4,3,5)
循环结束
过滤
把只有一个组,或者重复的滤去就可。
如果你的设计中不要求所有数都分到组里,其实就是组数+1 ,也就是说分三组的时候其实有个第四组用来废弃数据。 参考技术A 坐等大神出现学习下。。。。这个算法不好想
java8 小技巧保证分组groupingBy后排序不变
问题:
遇到一个小问题,查询出来一组数据后,按照其中的属性进行groupBy 分组 ,分组后要保证顺序不变。但是实际用groupBy进行分组后,返回的数据是杂乱无章的,没有按照原来list 的顺序返回
排查
首先去api中查找解决,查看Java 的 java.util.stream 包 Collectors 类 groupingBy 方法实现,结果如下:
//一个参数
public static <T, K> Collector<T, ?, Map<K, List<T>>>
groupingBy(Function<? super T, ? extends K> classifier)
return groupingBy(classifier, toList());
//两个参数
public static <T, K, A, D>
Collector<T, ?, Map<K, D>> groupingBy(Function<? super T, ? extends K> classifier,
Collector<? super T, A, D> downstream)
return groupingBy(classifier, HashMap::new, downstream);
//三个参数
public static <T, K, D, A, M extends Map<K, D>>
Collector<T, ?, M> groupingBy(Function<? super T, ? extends K> classifier,
Supplier<M> mapFactory,
Collector<? super T, A, D> downstream) ......
通过java api 发现 groupingBy 调用是内部自己创建了一个 HashMap ( HashMap::new)。因为 hashMap,是无无序的,是根据key的hashcode进行hash,然后放入对应的地方。所以在按照一定顺序put进HashMap中,然后遍历出HashMap的顺序跟put的顺序不同。
知道这个了就明白了为什么无序了。所以我们直接调用三个参数的 groupingBy 方法mapFactory ,传入有顺序的Map, LinkedHashMap 就可以了。
关于 LinkedHashMap 的信息自行百度
解决
创建Person数据集合,然后按照年龄排序,排序后进行分组,保证分组后顺序不变。
//创建数据
private static List<Person> getPersionList()
List<Person> persons = new ArrayList<>();
for (int i = 1; i <= 40; i++)
Random r = new Random();
Person person = new Person();
person.setName("abel-" + i);
person.setSex((int) (Math.random() * 2));
person.setGroup(String.valueOf(i%2));
person.setAge(25 + r.nextInt(50));
persons.add(person);
return persons;
/**
* 分组
*/
private static void groupByTest()
List<Person> persons = getPersionList();
//将list 排序,并按照排序后的结果进行有序分组
LinkedHashMap<Integer, List<Person>> ageMap = personsSort.stream().sorted(Comparator.comparingInt(Person::getAge)).collect(Collectors.groupingBy(Person::getAge, LinkedHashMap::new, Collectors.toList()));
关于 排序Comparator.comparingInt 参考:
https://www.jianshu.com/p/3f621e51f3
以上是关于Java 数据分组问题的主要内容,如果未能解决你的问题,请参考以下文章