均匀地将列表分发到Java的子列表中
发布时间:2020-12-15 04:37:04 所属栏目:Java 来源:网络整理
导读:我想将列表均匀分布到给定数量的子列表中. 例如,我有一个包含元素1到10的列表,我想要3个列表.这些应该是这样的: SL1 - {1,2,3,4}SL2 - {5,6,7}SL3 - {8,9,10} 重要提示:每个列表包含的内容不相关,即SL1可能具有{1,5,7,10}.最重要的是有2个大小为3的列表和1
我想将列表均匀分布到给定数量的子列表中.
例如,我有一个包含元素1到10的列表,我想要3个列表.这些应该是这样的: SL1 -> {1,2,3,4} SL2 -> {5,6,7} SL3 -> {8,9,10} 重要提示:每个列表包含的内容不相关,即SL1可能具有{1,5,7,10}.最重要的是有2个大小为3的列表和1个大小为4的列表. 我尝试了几件事,包括Iterables.partition,但这无济于事. 我提出的唯一有用的是: public Iterable<List<Integer>> distributeEvenlyQueryListIntoLists(final LinkedList<Integer> bigList,final Integer numberOfSublists) { List<List<Integer>> result = new ArrayList<>(); // Creates as many lists as needed for (int i = 0; i < numberOfSublists; i++) { result.add(new ArrayList<>()); } while (bigList.iterator().hasNext()) { for (int i = 0; i < numberOfSublists; i++) { if (!bigList.iterator().hasNext()) { break; } result.get(i).add(bigList.poll()); } } return result; } 传递的bigList不必是LinkedList,它可以是任何Iterable. 我特别讨厌创建子列表的第一个循环. 谢谢! 解决方法
只需以循环模式分发它们:
public <T> List<List<T>> partition(Iterable<T> iterable,int partitions){ List<List<T>> result = new ArrayList<>(partitions); for(int i = 0; i < partitions; i++) result.add(new ArrayList<>()); Iterator<T> iterator = iterable.iterator() for(int i = 0; iterator.hasNext(); i++) result.get(i % partitions).add(iterator.next()); return result; } 使用此代码运行的示例: List<String> l = Stream.iterate(0,i->i + 1).limit(25).map(i->Integer.toString(i)).collect(Collectors.toList()); System.out.println(partition(l,4).toString()); 产生
基本思想是向结果集中的每个列表添加一个元素.这样可以保证两个列表之间元素数量的差异不会超过1. 作为替代方案,您可以使用Iterables.partition的guavas实现,这需要稍微不同的方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |