急:求助java按序列编号排序(如1.2 ,1.11) java 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;public class TestSort { public static void main(String[] args) { List<String> lists = new ArrayList<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"); myComparator mycom = new myComparator(); Collections.sort(lists, mycom); System.out.println(lists.toString()); }}class myComparator implements Comparator { @Override public int compare(Object obj1, Object obj2) { 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 (int i = 0; i < str2.length; i++) { if (i <= (str1.length - 1)) { if (Long.valueOf(str2[i])>Long.valueOf(str1[i])) { return 1; } else if (Long.valueOf(str2[i])<Long.valueOf(str1[i])) { return -1; } else { continue; } } else { return 1; } } return 0; }}结果:[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]呵呵还是我自己给我自己代言 package test;public class TestSort { public static void main(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; String temp = ""; int flg = 0; for (int i = 1; i < strs.length; i++) { for (int j = i; j > 0; j--) { s1 = strs[j].split("\\."); s2 = strs[j - 1].split("\\."); for (int m = 0; m < s1.length; m++) { a[m] = Integer.parseInt(s1[m]); } for (int m = 0; m < s2.length; m++) {; b[m] = Integer.parseInt(s2[m]); } for (int n = 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 (String s : 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] public static void main(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 = new ArrayList<>(); for (String str : strs) { list.add(str.toCharArray()); } Comparator<char[]> c = new Comparator<char[]>() { @Override public int compare(char[] v1, char[] v2) { int p1 = 0, p2 = 0; int d1 = 0, d2 = 0; while (p1 < v1.length && p2 < v2.length) { while (p1 < v1.length && v1[p1] != '.') { p1++; } while (p2 < v2.length && v2[p2] != '.') { p2++; } int i1 = Integer.parseInt(new String(v1, d1, p1 - d1)); int i2 = Integer.parseInt(new String(v2, d2, p2 - d2)); if (i1 != i2) { return i1 - i2; } d1 = ++p1; d2 = ++p2; } return v1.length - v2.length; } }; Collections.sort(list, c); for (int i = 0; i < strs.length; i++) { strs[i] = new String(list.get(i)); } System.out.println(Arrays.toString(strs)); } 更新一下package ex;public class TestSort { public static void main(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; String temp = ""; int flg = 0; for (int i = 1; i < strs.length; i++) { for (int j = i; j > 0; j--) { s1 = strs[j].split("\\."); s2 = strs[j - 1].split("\\."); for (int m = 0; m < s1.length; m++) { a[m] = Integer.parseInt(s1[m]); } for (int m = 0; m < s2.length; m++) {; b[m] = Integer.parseInt(s2[m]); } for (int n = 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 (String s : 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, public static void main(String[] args) { String[] strs=new String[]{"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,new Comparator<String>(){ @Override public int compare(String o1, String o2) { String[] strs1=o1.split("\\."); String[] strs2=o2.split("\\."); int length=strs1.length>strs2.length?strs1.length:strs2.length; for(int i=0;i<length;i++){ int num1=0; int num2=0; try{ num1=Integer.parseInt(strs1[i]); num2=Integer.parseInt(strs2[i]); }catch(Exception e){ } if(num1<num2) return -1; if(num1>num2) return 1; } return 0; } }); System.out.println(Arrays.toString(strs)); } JDBC 无法删除数据库记录的问题 继承类的问题 JComboBox 通过查询返回的数据填加为其中一项 构造方法可以重载但不可以重写对吗? 请问如何通过正则表达式获取第一个关键字和第二个关键字之间的字符串? 寻Core Java中文电子书 有个难题有请高手帮忙解决。 一个数据库取出值的问题 关于输入的问题 谁能告诉我java里的Document类具体有什么用途啊? 编译没问题,为什么通不过啊? 不知道是否可以实现在jsp页面上显示图片啊
import java.util.Collections;
import java.util.Comparator;
import java.util.List;public class TestSort { public static void main(String[] args) {
List<String> lists = new ArrayList<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");
myComparator mycom = new myComparator();
Collections.sort(lists, mycom);
System.out.println(lists.toString()); }}class myComparator implements Comparator { @Override
public int compare(Object obj1, Object obj2) {
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 (int i = 0; i < str2.length; i++) {
if (i <= (str1.length - 1)) {
if (Long.valueOf(str2[i])>Long.valueOf(str1[i])) {
return 1;
} else if (Long.valueOf(str2[i])<Long.valueOf(str1[i])) {
return -1;
} else {
continue;
}
} else {
return 1;
}
}
return 0;
}}结果:
[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]呵呵还是我自己给我自己代言
package test;public class TestSort {
public static void main(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;
String temp = "";
int flg = 0;
for (int i = 1; i < strs.length; i++) { for (int j = i; j > 0; j--) { s1 = strs[j].split("\\.");
s2 = strs[j - 1].split("\\."); for (int m = 0; m < s1.length; m++) {
a[m] = Integer.parseInt(s1[m]);
}
for (int m = 0; m < s2.length; m++) {;
b[m] = Integer.parseInt(s2[m]);
} for (int n = 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 (String s : 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, 还是一个排序算法,比较大小的方法略有不同。
我的思路是将其装换成一个整形数组,使用循环按位比较大小,直至出现不等。楼主这里限定了层级。本人菜鸟,楼主给点分鼓励下呗
写一个正确的应该不难,不过如果要考虑效率问题的话这就是一个复杂的问题了
考虑到你的需求应该比较固定,只需要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]
public static void main(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 = new ArrayList<>();
for (String str : strs) {
list.add(str.toCharArray());
}
Comparator<char[]> c = new Comparator<char[]>() {
@Override
public int compare(char[] v1, char[] v2) {
int p1 = 0, p2 = 0;
int d1 = 0, d2 = 0;
while (p1 < v1.length && p2 < v2.length) {
while (p1 < v1.length && v1[p1] != '.') {
p1++;
}
while (p2 < v2.length && v2[p2] != '.') {
p2++;
}
int i1 = Integer.parseInt(new String(v1, d1, p1 - d1));
int i2 = Integer.parseInt(new String(v2, d2, p2 - d2));
if (i1 != i2) {
return i1 - i2;
}
d1 = ++p1;
d2 = ++p2;
}
return v1.length - v2.length;
}
};
Collections.sort(list, c);
for (int i = 0; i < strs.length; i++) {
strs[i] = new String(list.get(i));
}
System.out.println(Arrays.toString(strs));
}
package ex;public class TestSort {
public static void main(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;
String temp = "";
int flg = 0;
for (int i = 1; i < strs.length; i++) { for (int j = i; j > 0; j--) { s1 = strs[j].split("\\.");
s2 = strs[j - 1].split("\\."); for (int m = 0; m < s1.length; m++) {
a[m] = Integer.parseInt(s1[m]);
} for (int m = 0; m < s2.length; m++) {;
b[m] = Integer.parseInt(s2[m]);
}
for (int n = 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 (String s : 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,
String[] strs=new String[]{"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,new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
String[] strs1=o1.split("\\.");
String[] strs2=o2.split("\\.");
int length=strs1.length>strs2.length?strs1.length:strs2.length;
for(int i=0;i<length;i++){
int num1=0;
int num2=0;
try{
num1=Integer.parseInt(strs1[i]);
num2=Integer.parseInt(strs2[i]);
}catch(Exception e){
}
if(num1<num2)
return -1;
if(num1>num2)
return 1;
}
return 0;
}
});
System.out.println(Arrays.toString(strs));
}