急:求助java按序列编号排序(如1.2 ,1.11)

问题描述

求助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));}

时间: 2024-10-02 02:18:26

急:求助java按序列编号排序(如1.2 ,1.11)的相关文章

遍历-两个java数组比大小排序

问题描述 两个java数组比大小排序 举个例子,我现在有两个集合数组 A ={32,43,28,3,67,20, 40,0, 59 } B = {3 ,45, 18 ,83 ,30 ,28 ,40,56 ,25} 我要对两个集合数组的大小进行一 一的比较,最后整合到一个大集合数组C中,数字大的排的前面,数字小的在后面,如果AB有数字相同的,那将A组里面的数字排到B前面.求大神帮忙怎么用循环遍历来写这一段代码. 解决方案 上面写成了从小到大排序了,不好意思 public static int[]

java中List对象排序通用方法_java

本文实例讲述了java中List对象排序通用方法.分享给大家供大家参考.具体分析如下: 在数据库中查出来的列表list中,往往需要对不同的字段重新排序,一般的做法都是使用排序的字段,重新到数据库中查询.如果不到数据库查询,直接在第一次查出来的list中排序,无疑会提高系统的性能. 只要把第一次查出来的结果存放在session中,就可以对list重新排序了.一般对list排序可以使用Collections.sort(list),但如果list中包含是一个对象的话,这种方法还是行不通的.那要怎么排序

java交换排序之鸡尾酒排序实现方法_java

本文实例讲述了java交换排序之鸡尾酒排序实现方法.分享给大家供大家参考.具体如下: 鸡尾酒排序,也就是定向冒泡排序, 鸡尾酒搅拌排序, 搅拌排序 (也可以视作选择排序的一种变形), 涟漪排序, 来回排序 or 快乐小时排序, 是冒泡排序的一种变形.此算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序. 与冒泡排序不同的地方: 鸡尾酒排序等于是冒泡排序的轻微变形.不同的地方在于从低到高然后从高到低,而冒泡排序则仅从低到高去比较序列里的每个元素.他可以得到比冒泡排序稍微好一点的效能,原因是冒

java swing 视频-我是一名在校研一的学生,现在急需要java swing的视频,谁能推荐一下啊!谢谢啦

问题描述 我是一名在校研一的学生,现在急需要java swing的视频,谁能推荐一下啊!谢谢啦 我是一名在校研一的学生,现在急需要java swing的视频,谁能推荐一下啊!谢谢啦 解决方案 http://v.baidu.com/v?s=8&word=java%20swing%20%CA%D3%C6%B5&fr=ala11 解决方案二: 参考:http://www.java1234.com/a/yuanchuang/swing/ 解决方案三: http://school.itzcn.com

ChemBio 3D软件如何添加序列编号

ChemBio 3D软件能够轻松快捷地建立和编辑化学模型,在化学.生物.医药领域应用广泛.本教程将向大家介绍如何给ChemBio 3D添加序列编号和原子符号. ChemBio 3D软件添加序列编号和原子符号的具体步骤如下: (1)单击选择工具. (2)对角按动鼠标键把要选择的原子和键加上. (3)此例中释放鼠标键,全部原子和键都将被选上. (4)在模型窗口中右击,选择"Show Serial Numbers"命令(如下图左),原子上就可以出现序列编号,如下图右所示: 显示序列编号 (5

链表-求助Java算法,这两个算法问题有Java代码实现

问题描述 求助Java算法,这两个算法问题有Java代码实现 从N个元素集合里面随机抽取M个元素(M<N). C/C++: void randomChoose(int*data, intn, int *result, int m); Java: void randomChoose(int data[], int result[]); 说明: 1.Data是待抽取的元素集合,n是data的长度,result是抽取的结果,m是结果集的长度. 2.同一个元素不能被反复抽取. 3.每个元素被抽取到的概率

ndroid-新人求助 java.lang.NullPointerException

问题描述 新人求助 java.lang.NullPointerException 04-26 21:42:40.039: E/AndroidRuntime(1125): FATAL EXCEPTION: main 04-26 21:42:40.039: E/AndroidRuntime(1125): Process: com.example.remotecontrol, PID: 1125 04-26 21:42:40.039: E/AndroidRuntime(1125): java.lang

关于java问题-求助java编写电影院座位!!!!急用,大神帮帮忙!

问题描述 求助java编写电影院座位!!!!急用,大神帮帮忙! 格式是5行7列,每个座位格式是(1-1)这样.谢谢大家了.大神们在哪里? 解决方案 写个2重循环,一个控制行,一个控制列 解决方案二: 写个类-俩属性-行和列-ToString方法返回1-1这样格式的字符串-值来自两个属性-有属性的set和get方法-搞定

rational software architect9 java生成序列图,软件死机

问题描述 rational software architect9 java生成序列图,软件死机 有谁知道的吗? 解决方案 Eclipse或myeclipse的内存不足造成的 解决方案二: 关闭了重新开下看看,先产生一个简单的看看 还不行是软件环境的问题 解决方案三: 简单的可以的.中等软件就卡了. 这么大的软件对付稍微大点的就不行,不会这么差吧 解决方案四: 设置了.好了. -Xms512M -Xmx512M -XX:PermSize=128M -XX:MaxPermSize=128M