问题描述
求助java按序列编号排序如:现有一组序号为:1.11.111.22.12.55.51.11.1可能级别有更多如:1.4.1.1要求排序完的结果是1.1,1.2,1.11,1.11.1,2.1,2.5,5.5
解决方案
解决方案二:
你的排序没看出有什么规则。。。
解决方案三:
importjava.util.ArrayList;importjava.util.Collections;importjava.util.Comparator;importjava.util.List;publicclassTestSort{publicstaticvoidmain(String[]args){List<String>lists=newArrayList<String>();lists.add("1.1");lists.add("1.2");lists.add("1.11");lists.add("2.1");lists.add("1.3.1");lists.add("1.4.1");lists.add("1.4.1.3");lists.add("1.4.2.3");lists.add("1.3");lists.add("1.4.2");lists.add("2.11");myComparatormycom=newmyComparator();Collections.sort(lists,mycom);System.out.println(lists.toString());}}classmyComparatorimplementsComparator{@Overridepublicintcompare(Objectobj1,Objectobj2){if(obj1==null||obj2==null){return-1;}String[]temp1=obj1.toString().split("\.");String[]temp2=obj2.toString().split("\.");String[]str1;String[]str2;if(temp1.length>temp2.length){str2=temp1;str1=temp2;}else{str1=temp2;str2=temp1;}for(inti=0;i<str2.length;i++){if(i<=(str1.length-1)){if(Long.valueOf(str2[i])>Long.valueOf(str1[i])){return1;}elseif(Long.valueOf(str2[i])<Long.valueOf(str1[i])){return-1;}else{continue;}}else{return1;}}return0;}}结果:[1.1,1.2,1.3,1.3.1,1.4.1,1.4.1.3,1.4.2,1.4.2.3,1.11,2.1,2.11]呵呵还是我自己给我自己代言
解决方案四:
packagetest;publicclassTestSort{publicstaticvoidmain(String[]args){String[]strs={"1.1","1.2","1.11","2.1","1.3.1","1.4.1","1.4.1.3","1.4.2.3","1.3","1.4.2","2.11"};int[]a={0,0,0,0};int[]b={0,0,0,0};String[]s1;String[]s2;Stringtemp="";intflg=0;for(inti=1;i<strs.length;i++){for(intj=i;j>0;j--){s1=strs[j].split("\.");s2=strs[j-1].split("\.");for(intm=0;m<s1.length;m++){a[m]=Integer.parseInt(s1[m]);}for(intm=0;m<s2.length;m++){;b[m]=Integer.parseInt(s2[m]);}for(intn=0;n<4;n++){if((flg=(a[n]-b[n]))!=0){break;}}if(flg<0){temp=strs[j];strs[j]=strs[j-1];strs[j-1]=temp;}}}System.out.println("排序后");for(Strings:strs)System.out.print(s+",");}}
排序后1.1,1.2,1.3.1,1.3,1.4.1,1.4.1.3,1.4.2.3,1.4.2,1.11,2.1,2.11,还是一个排序算法,比较大小的方法略有不同。我的思路是将其装换成一个整形数组,使用循环按位比较大小,直至出现不等。楼主这里限定了层级。本人菜鸟,楼主给点分鼓励下呗
解决方案五:
写一个Comparator然后交给Collections.sort去排序就好了写一个正确的应该不难,不过如果要考虑效率问题的话这就是一个复杂的问题了考虑到你的需求应该比较固定,只需要split字符'.',所以自己写了一个专门针对'.'的split。另外先将字符串的char数组保存起来,然后排序char数组,最后再转换回字符串,对于我这个split方法来说可以避免重复toCharArray生成太多冗余char数组。当然这不是最高效的办法,最好的办法是用int数组保存这些数据而不是字符串(不过要在效率很重要的前提下,否则过早优化毫无意义)。以下代码输出[1.1,1.2,1.2,1.3,1.3.1,1.4.1,1.4.1.3,1.4.2,1.4.2.3,1.11,2.1,2.11]publicstaticvoidmain(String[]args){String[]strs={"1.1","1.2","1.11","2.1","1.3.1","1.4.1","1.4.1.3","1.4.2.3","1.3","1.2","1.4.2","2.11"};List<char[]>list=newArrayList<>();for(Stringstr:strs){list.add(str.toCharArray());}Comparator<char[]>c=newComparator<char[]>(){@Overridepublicintcompare(char[]v1,char[]v2){intp1=0,p2=0;intd1=0,d2=0;while(p1<v1.length&&p2<v2.length){while(p1<v1.length&&v1[p1]!='.'){p1++;}while(p2<v2.length&&v2[p2]!='.'){p2++;}inti1=Integer.parseInt(newString(v1,d1,p1-d1));inti2=Integer.parseInt(newString(v2,d2,p2-d2));if(i1!=i2){returni1-i2;}d1=++p1;d2=++p2;}returnv1.length-v2.length;}};Collections.sort(list,c);for(inti=0;i<strs.length;i++){strs[i]=newString(list.get(i));}System.out.println(Arrays.toString(strs));}
解决方案六:
自己实现一个比较器就可以了。要看数据量有多大,比较器里面的性能还是有差别的。
解决方案七:
引用3楼yinan9的回复:更新一下packageex;publicclassTestSort{publicstaticvoidmain(String[]args){String[]strs={"1.1","1.2","1.11","2.1","1.3.1","1.4.1","1.4.1.3","1.4.2.3","1.3","1.4.2","2.11"};//String[]strs={"1.2","1.1"};int[]a={0,0,0,0};int[]b={0,0,0,0};String[]s1;String[]s2;Stringtemp="";intflg=0;for(inti=1;i<strs.length;i++){for(intj=i;j>0;j--){s1=strs[j].split("\.");s2=strs[j-1].split("\.");for(intm=0;m<s1.length;m++){a[m]=Integer.parseInt(s1[m]);}for(intm=0;m<s2.length;m++){;b[m]=Integer.parseInt(s2[m]);}for(intn=0;n<4;n++){if((a[n]-b[n])!=0){flg=a[n]-b[n];System.out.println("flg="+flg);break;}}if(flg<0){temp=strs[j];strs[j]=strs[j-1];strs[j-1]=temp;}}}System.out.println("排序后");for(Strings:strs)System.out.print(s+",");}}
排序后1.1,1.2,1.3,1.3.1,1.4.1,1.4.1.3,1.4.2,1.4.2.3,1.11,2.1,2.11,
解决方案八:
publicstaticvoidmain(String[]args){String[]strs=newString[]{"1.1","1.2","1.11","2.1","1.3.1","1.4.1","1.4.1.3","1.4.2.3","1.3","1.4.2","2.11"};Arrays.sort(strs,newComparator<String>(){@Overridepublicintcompare(Stringo1,Stringo2){String[]strs1=o1.split("\.");String[]strs2=o2.split("\.");intlength=strs1.length>strs2.length?strs1.length:strs2.length;for(inti=0;i<length;i++){intnum1=0;intnum2=0;try{num1=Integer.parseInt(strs1[i]);num2=Integer.parseInt(strs2[i]);}catch(Exceptione){}if(num1<num2)return-1;if(num1>num2)return1;}return0;}});System.out.println(Arrays.toString(strs));}