java一个list拆分的问题
java 如何将一个list平均拆成十个list,如果 list的size不能被10整除那么 ,比如是size是599,那么前九个每个list是60,最后一个list的是59,一次类推 ,也就是说如果不能整除 也尽量保证10个list尽量 保持 平均,前九个一样大剩余的给第十个,总数加起来 还是list的总大小,这个算法怎么写? --------------------编程问答-------------------- java裏面有個求模的 比如 599%10這樣就等於9 可以先分最後的 在平分前面的 --------------------编程问答-------------------- /*** @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Integer> list = new ArrayList<Integer>();
for (int i = 1; i < 55; i++) //55是一个动态变量 测试的时候先写死
list.add(i);
int count = list.size() / 10;
int yu = list.size() % 10;
for (int i = 0; i < 10; i++) {
List<Integer> subList = new ArrayList<Integer>();
if (i == 9) {
subList = list.subList(i * count, count * (i + 1) + yu);
} else {
subList = list.subList(i * count, count * (i + 1));
}
System.out.println(subList);
}
}
我网上看了下 修改了 一下 现在这样先输出结果是对的,你们帮我看看还有什么疏漏没?或者有没有更好的写法 --------------------编程问答-------------------- 这个
public static void main(String[] args) throws IOException {--------------------编程问答-------------------- 啥意思 啊 能写完整点不 --------------------编程问答--------------------
int num = 599;
int tem = 0;
if (num % 10 != 0) {
tem = 10 - num % 10;
System.out.println((tem + num) / 10);
System.out.println(num - (tem + num) / 10 * 9);
}
}
我觉得也是先求余数操作,如果等于0的话 正好分配完全
余数等于9的话 ,前9个list的size可以分成一样大,最后一个最小
余数小于9 一个结果 最后一个list的size最大 --------------------编程问答-------------------- 这个只是判断前面有多少个相同的,最后一个的个数是多少。mod可以算出来。
后面就用subList函数就行了 --------------------编程问答-------------------- 那具体怎么写好呢 最好性能好点 因为实际项目中 这个list的size可能会有好几万 --------------------编程问答--------------------
--------------------编程问答-------------------- 能写完整点么 --------------------编程问答--------------------
double First=599;
double Second=10;
int scale=0;
BigDecimal b1 = new BigDecimal(Double.toString(First));
BigDecimal b2 = new BigDecimal(Double.toString(Second));
int one=(int) b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println(one);
int lost=(int) (First-one*(Second-1));
System.out.println(lost);
我觉得你把好几万的数据放到list就是不明智的选择。性能好点的话,不要把所有记录全部放到list里,在数据库层分页。
比如记录有10000条,此时你要分成100个list,那你先取100个放list里。 --------------------编程问答--------------------
--------------------编程问答--------------------
int First=599;
int Second=10;
int scale=0;
BigDecimal b1 = new BigDecimal(Double.toString(First));
BigDecimal b2 = new BigDecimal(Double.toString(Second));
//前面9个的值
int one=b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).intValue();
System.out.println(one);
//最后一个的值
int lost=First-one*(Second-1);
System.out.println(lost);
那具体怎么写好呢 最好性能好点 因为实际项目中 这个list的size可能会有好几万
这个只是判断前面有多少个相同的,最后一个的个数是多少。mod可以算出来。
后面就用subList函数就行了
我觉得你把好几万的数据放到list就是不明智的选择。性能好点的话,不要把所有记录全部放到list里,在数据库层分页。
比如记录有10000条,此时你要分成100个list,那你先取100个放list里。
public static void main(String[] args) {
//你的list.size
int First=599;
//你要分组成几个list
int Second=10;
//精度
int scale=0;
BigDecimal b1 = new BigDecimal(Double.toString(First));
BigDecimal b2 = new BigDecimal(Double.toString(Second));
//前面9个的值
int one=b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).intValue();
System.out.println(one);
//最后一个的值
int lost=First-one*(Second-1);
System.out.println(lost);
}
还有说明一点线程不是你这么玩的,可以把整个list共享出来,线程可以不重复的取,而且哪个完了哪个出来取点。 --------------------编程问答--------------------
public static void main(String[] args) throws IOException {--------------------编程问答--------------------
// list 的长度
int num = 599;
int temp = 0;
// 不能够整除10的场合
if (num % 10 != 0) {
//需要凑的数量
temp = 10 - num % 10;
//前9个每个取的条数
System.out.println((temp + num) / 10);
//第10个最后一条取的list的长度
System.out.println(num - (temp + num) / 10 * 9);
}
}
public static void main(String[] args) throws IOException {
// list 的长度
int num = 599;
int temp = 0;
// 不能够整除10的场合
if (num % 10 != 0) {
//需要凑的数量
temp = 10 - num % 10;
//前9个每个取的条数
System.out.println((temp + num) / 10);
//第10个最后一条取的list的长度
System.out.println(num - (temp + num) / 10 * 9);
}
}
601条的时候 前9条是 61,最后一个是 52 这个不合理吧
如果尽量平均 前9个应该是 60 最后一个是 61吧 --------------------编程问答--------------------
public static void main(String[] args) throws IOException {
// list 的长度
int num = 599;
int temp = 0;
// 不能够整除10的场合
if (num % 10 != 0) {
//需要凑的数量
temp = 10 - num % 10;
//前9个每个取的条数
System.out.println((temp + num) / 10);
//第10个最后一条取的list的长度
System.out.println(num - (temp + num) / 10 * 9);
}
}
不够平均哦~ 这个只往上凑数 要是591, 就不够平均了 --------------------编程问答-------------------- 用自带的方法吧
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) {
/*
* IMPLEMENTATION NOTE: This method *must* return a new object
* since divideAndRound uses divide to generate a value whose
* scale is then modified.
*/
if (roundingMode < ROUND_UP || roundingMode > ROUND_UNNECESSARY)
throw new IllegalArgumentException("Invalid rounding mode");
/*
* Rescale dividend or divisor (whichever can be "upscaled" to
* produce correctly scaled quotient).
* Take care to detect out-of-range scales
*/
BigDecimal dividend = this;
if (checkScale((long)scale + divisor.scale) > this.scale)
dividend = this.setScale(scale + divisor.scale, ROUND_UNNECESSARY);
else
divisor = divisor.setScale(checkScale((long)this.scale - scale),
ROUND_UNNECESSARY);
return divideAndRound(dividend.intCompact, dividend.intVal,
divisor.intCompact, divisor.intVal,
scale, roundingMode, scale);
}
601条的时候 前9条是 61,最后一个是 52 这个不合理吧
如果尽量平均 前9个应该是 60 最后一个是 61吧
不够平均哦~ 这个只往上凑数 要是591, 就不够平均了
没考虑全
// list 的长度--------------------编程问答-------------------- 和分页查询的思路貌似有点类似
int num = 591;
int temp = 0;
// 不能够整除10的场合
if (num % 10 != 0) {
if(num % 10<5){
//需要凑的数量
temp =num % 10;
//前9个每个取的条数
System.out.println((num-temp) / 10);
//第10个最后一条取的list的长度
System.out.println(num - (num-temp) / 10 * 9);
}else{
//需要凑的数量
temp = 10 - num % 10;
//前9个每个取的条数
System.out.println((temp + num) / 10);
//第10个最后一条取的list的长度
System.out.println(num - (temp + num) / 10 * 9);
}
}
总数(size) 每一页显示的数据个数(list大小) 多少页(拆分的list个数) --------------------编程问答-------------------- 我自己 最终是这样写的 :
/**
* java list拆分最终确定版
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Integer> list = new ArrayList<Integer>();
int sizes=122; //sizes是一个动态变量 测试的时候先写死
for (int i = 1; i <= sizes; i++)
list.add(i);
int count = list.size()/10;
int yu = list.size() % 10;
for (int i = 0; i < 10; i++) {
List<Integer> subList = new ArrayList<Integer>();
if (i == 9) {
subList = list.subList(i * count, count * (i + 1) + yu);
} else {
subList = list.subList(i * count, count * (i + 1));
}
System.out.println(subList);
}
} --------------------编程问答-------------------- 先用SQL查询总数据量,然后将总数据量求10份或多分的平均值(线程变量),然后定义线程变量,记录已经取到多少条数据了,查询从多少条到多少条数据,并修改已经取到第多少数据了! --------------------编程问答-------------------- 先取平均数,然后把剩余元素平均分到每个list上
比如23,平均数2,剩余元素3
结果:3,3,3,2,2,2,2,2,2,2
public static void main(String[] args) {
int size = 586;//总数
int listCount = 10;//拆分数量
int[] arr = new int[listCount];
int avg = size / listCount;//平均数
int addIndex = size - avg * listCount;//需要增加1个数量的最大下标
for(int i = 0;i < listCount;++i) {
arr[i] = i < addIndex ? avg + 1 : avg;
}
System.out.println(Arrays.toString(arr));
}
[59, 59, 59, 59, 59, 59, 58, 58, 58, 58]
补充:Java , Java相关