优雅的使用Java从List均匀分三段,如果数据不为3的倍数,则第一段取最少,然后随机取分段中的一条数据,最后取得三条数据代码实现
时间: 2023-11-15 20:05:02 浏览: 77
可以按照以下步骤实现:
1. 计算出将 List 均匀分成三段后,每一段的长度应该是多少。
2. 将 List 按照上一步计算出的长度进行切分,得到三个子列表。
3. 如果 List 的长度不是 3 的倍数,则将第一段的长度加 1。
4. 从三个子列表中随机选择一个,将其加入第一段。
5. 分别从三个子列表中选择一条数据,将它们加入第二段。
6. 分别从三个子列表中选择一条数据,将它们加入第三段。
7. 将三个段的数据合并成一个 List,返回结果。
下面是对应的 Java 代码实现:
```java
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class ListDivider {
public static void main(String[] args) {
List<String> data = new ArrayList<>();
data.add("A");
data.add("B");
data.add("C");
data.add("D");
data.add("E");
data.add("F");
data.add("G");
List<List<String>> result = divideList(data, 3);
System.out.println(result);
}
public static <T> List<List<T>> divideList(List<T> list, int numSections) {
int totalSize = list.size();
int chunkSize = totalSize / numSections;
int remainder = totalSize % numSections;
List<List<T>> sections = new ArrayList<>();
int offset = 0;
for (int i = 0; i < numSections; i++) {
int size = chunkSize + (remainder-- > 0 ? 1 : 0);
List<T> section = list.subList(offset, offset + size);
sections.add(section);
offset += size;
}
Random random = new Random();
int randomIndex = random.nextInt(sections.size());
List<T> firstSection = sections.get(0);
T randomItem = sections.get(randomIndex).get(random.nextInt(sections.get(randomIndex).size()));
firstSection.add(randomItem);
List<T> secondSection = new ArrayList<>();
List<T> thirdSection = new ArrayList<>();
for (int i = 0; i < sections.size(); i++) {
List<T> section = sections.get(i);
T item = section.get(random.nextInt(section.size()));
if (i == 0) {
continue;
} else if (i == 1) {
secondSection.add(item);
} else {
thirdSection.add(item);
}
}
List<List<T>> result = new ArrayList<>();
result.add(firstSection);
result.add(secondSection);
result.add(thirdSection);
return result;
}
}
```
这个程序的输出结果可能会因为随机数生成器的不同而有所不同,但是每个分段中的数据应该是均匀分布的。
阅读全文