问题描述
java如何将一个list平均拆成十个list,如果list的size不能被10整除那么,比如是size是599,那么前九个每个list是60,最后一个list的是59,一次类推,也就是说如果不能整除也尽量保证10个list尽量保持平均,前九个一样大剩余的给第十个,总数加起来还是list的总大小,这个算法怎么写?
解决方案
解决方案二:
java裏面有個求模的比如599%10這樣就等於9可以先分最後的在平分前面的
解决方案三:
/***@paramargs*/publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubList<Integer>list=newArrayList<Integer>();for(inti=1;i<55;i++)//55是一个动态变量测试的时候先写死list.add(i);intcount=list.size()/10;intyu=list.size()%10;for(inti=0;i<10;i++){List<Integer>subList=newArrayList<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);}}我网上看了下修改了一下现在这样先输出结果是对的,你们帮我看看还有什么疏漏没?或者有没有更好的写法
解决方案四:
这个publicstaticvoidmain(String[]args)throwsIOException{intnum=599;inttem=0;if(num%10!=0){tem=10-num%10;System.out.println((tem+num)/10);System.out.println(num-(tem+num)/10*9);}}
解决方案五:
引用3楼rui888的回复:
这个publicstaticvoidmain(String[]args)throwsIOException{intnum=599;inttem=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函数就行了
解决方案八:
引用6楼huxiweng的回复:
这个只是判断前面有多少个相同的,最后一个的个数是多少。mod可以算出来。后面就用subList函数就行了
那具体怎么写好呢最好性能好点因为实际项目中这个list的size可能会有好几万
解决方案九:
doubleFirst=599;doubleSecond=10;intscale=0;BigDecimalb1=newBigDecimal(Double.toString(First));BigDecimalb2=newBigDecimal(Double.toString(Second));intone=(int)b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();System.out.println(one);intlost=(int)(First-one*(Second-1));System.out.println(lost);
解决方案十:
引用8楼scottxzj的回复:
doubleFirst=599;doubleSecond=10;intscale=0;BigDecimalb1=newBigDecimal(Double.toString(First));BigDecimalb2=newBigDecimal(Double.toString(Second));intone=(int)b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();System.out.println(one);intlost=(int)(First-one*(Second-1));System.out.println(lost);
能写完整点么
解决方案十一:
引用7楼koproblem的回复:
Quote: 引用6楼huxiweng的回复:
这个只是判断前面有多少个相同的,最后一个的个数是多少。mod可以算出来。后面就用subList函数就行了那具体怎么写好呢最好性能好点因为实际项目中这个list的size可能会有好几万
我觉得你把好几万的数据放到list就是不明智的选择。性能好点的话,不要把所有记录全部放到list里,在数据库层分页。比如记录有10000条,此时你要分成100个list,那你先取100个放list里。
解决方案十二:
intFirst=599;intSecond=10;intscale=0;BigDecimalb1=newBigDecimal(Double.toString(First));BigDecimalb2=newBigDecimal(Double.toString(Second));//前面9个的值intone=b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).intValue();System.out.println(one);//最后一个的值intlost=First-one*(Second-1);System.out.println(lost);
解决方案十三:
引用10楼huxiweng的回复:
Quote: 引用7楼koproblem的回复:
Quote: 引用6楼huxiweng的回复:
这个只是判断前面有多少个相同的,最后一个的个数是多少。mod可以算出来。后面就用subList函数就行了那具体怎么写好呢最好性能好点因为实际项目中这个list的size可能会有好几万
我觉得你把好几万的数据放到list就是不明智的选择。性能好点的话,不要把所有记录全部放到list里,在数据库层分页。比如记录有10000条,此时你要分成100个list,那你先取100个放list里。
我要做并发任务,所以要全部拿到再分成十份list进行分发
解决方案十四:
publicstaticvoidmain(String[]args){//你的list.sizeintFirst=599;//你要分组成几个listintSecond=10;//精度intscale=0;BigDecimalb1=newBigDecimal(Double.toString(First));BigDecimalb2=newBigDecimal(Double.toString(Second));//前面9个的值intone=b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).intValue();System.out.println(one);//最后一个的值intlost=First-one*(Second-1);System.out.println(lost);}
还有说明一点线程不是你这么玩的,可以把整个list共享出来,线程可以不重复的取,而且哪个完了哪个出来取点。
解决方案十五:
publicstaticvoidmain(String[]args)throwsIOException{//list的长度intnum=599;inttemp=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);}}
解决方案:
引用14楼rui888的回复:
publicstaticvoidmain(String[]args)throwsIOException{//list的长度intnum=599;inttemp=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吧
解决方案:
引用14楼rui888的回复:
publicstaticvoidmain(String[]args)throwsIOException{//list的长度intnum=599;inttemp=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,就不够平均了
解决方案:
用自带的方法吧publicBigDecimaldivide(BigDecimaldivisor,intscale,introundingMode){/**IMPLEMENTATIONNOTE:Thismethod*must*returnanewobject*sincedivideAndRoundusesdividetogenerateavaluewhose*scaleisthenmodified.*/if(roundingMode<ROUND_UP||roundingMode>ROUND_UNNECESSARY)thrownewIllegalArgumentException("Invalidroundingmode");/**Rescaledividendordivisor(whichevercanbe"upscaled"to*producecorrectlyscaledquotient).*Takecaretodetectout-of-rangescales*/BigDecimaldividend=this;if(checkScale((long)scale+divisor.scale)>this.scale)dividend=this.setScale(scale+divisor.scale,ROUND_UNNECESSARY);elsedivisor=divisor.setScale(checkScale((long)this.scale-scale),ROUND_UNNECESSARY);returndivideAndRound(dividend.intCompact,dividend.intVal,divisor.intCompact,divisor.intVal,scale,roundingMode,scale);}
引用15楼songbgi的回复:
601条的时候前9条是61,最后一个是52这个不合理吧如果尽量平均前9个应该是60最后一个是61吧
引用16楼scottxzj的回复:
不够平均哦~这个只往上凑数要是591,就不够平均了
没考虑全//list的长度intnum=591;inttemp=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个数)
解决方案:
我自己最终是这样写的:/***javalist拆分最终确定版*@paramargs*/publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubList<Integer>list=newArrayList<Integer>();intsizes=122;//sizes是一个动态变量测试的时候先写死for(inti=1;i<=sizes;i++)list.add(i);intcount=list.size()/10;intyu=list.size()%10;for(inti=0;i<10;i++){List<Integer>subList=newArrayList<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,2publicstaticvoidmain(String[]args){intsize=586;//总数intlistCount=10;//拆分数量int[]arr=newint[listCount];intavg=size/listCount;//平均数intaddIndex=size-avg*listCount;//需要增加1个数量的最大下标for(inti=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]