《Java 实用技巧:均匀取元素算法(支持不足补齐)》
📰 概要/摘要示例
在日常开发中,我们经常需要从多个列表中均匀抽取一定数量的元素。例如从多个数据源、分批任务队列中获取一定数量的任务。
本文介绍了一种 简洁高效的 Java 实现:通过轮询的方式从每个
List中依次取元素,当某个列表取完后自动跳过,直到总共取满指定数量N个元素为止。代码不到 20 行,逻辑清晰,无需随机数或复杂分配算法,非常适合在业务层快速实现“均匀取数”“多源任务分配”等需求。
简单、顺序均匀取元素的版本,
要求:
从多个
List中取 总共 N 个元素;每个 list 先取 1 个,按顺序轮流取;
如果不够 N,就继续从头循环取;
某个 list 没元素了,就跳过它。
⚙️ 特点
✅ 均匀轮流取
✅ 自动跳过取空的 list
✅ 自动补齐直到 N 或所有元素取完
✅ 简洁清晰、无随机
✅ 简化版 Java 实现(无随机)
import java.util.*;public class EvenPicker {public static <T> List<T> pickEvenly(List<List<T>> lists, int N) {List<T> result = new ArrayList<>();int[] indexes = new int[lists.size()]; // 每个list当前取到的位置while (result.size() < N) {boolean allEmpty = true;for (int i = 0; i < lists.size(); i++) {List<T> lst = lists.get(i);if (indexes[i] < lst.size()) {result.add(lst.get(indexes[i]));indexes[i]++;allEmpty = false;if (result.size() >= N) break;}}if (allEmpty) break; // 所有list都取完了}return result;}public static void main(String[] args) {List<List<Integer>> lists = Arrays.asList(Arrays.asList(1, 2, 3),Arrays.asList(10, 11, 12, 13),Arrays.asList(20, 21));List<Integer> result = pickEvenly(lists, 10);System.out.println(result);}
}
🔍 输出示例
[1, 10, 20, 2, 11, 21, 3, 12, 13]
