很难的数字排序问题 我想做个排序,假设有一组数里面包含('1','2','012','3','04',还有'16_1','18_2')等字符串要求得到排序结果'1','2','3','04','012','16_1','18_2'.主要是数据遗留问题.感觉很难做.希望高手帮忙.谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 首先分成2组: 1组是能直接转int的,另一组带"_"的。各自求值问题应该不大麻烦的应该是有没有 15_3 , 15_6这种问题 字符串数组的话,用replace()或者 replaceAll(),把非数字替换成"",再转化成int型循环比较大小 对,是有15_3,15_6而且还有15_3,15+4,这种问题.因为用户在输入的时候没有进行控制所以导致现在数据格式不统一.比较麻烦.假设我已经取到一组字符串型的数字放入了List当中.如何过滤?谢谢! 这个很简单,用一个类包装继承Comparable就可以了。有什么难的地方?最麻烦的也就是 麻烦的应该是有没有 15_3 , 15_6这种问题妈的,只有一位的话,改成小数点。 用javascript写的一个实现~function mysort(){ var src = new Array('1','2','012','3','04','16_1','18_2'); alert("排序前数组[" + src.toString()+"];"); var dest = src.sort( function st(a,b){ return parseInt(a)-parseInt(b); } ); alert("排序后数组[" + dest.toString()+"];");}结果:排序前数组[1,2,012,3,04,16_1,18_2]排序后数组[1,2,3,04,012,16_1,18_2] 说明一下,结果中不带引号是因为src.toString()的缘故;其实src和dest都是字符串数组 对于15_3,15_6而且还有15_3,15+4之类的,只要你定义一个统一的比较规则就可以了~比如你规定15_6<15_6<15+3,也就是先比较整数(+/-前面的),如果前面相等,那就比较后面的,_看做-,+看做+,那上面代码进一步改为:function mysort(){ var src = new Array('1','15_6','2','012','15_3','3','04','16_1','15+6','18_2'); alert("排序前数组[" + src.toString()+"];"); var dest = src.sort( function st(a,b){ if (a == b){ return 0; } var _a = parseInt(a); var _b = parseInt(b); if (_a == _b){ var _tA = a.replace('_','-'); var _tB = b.replace('_','-'); var _tmpA = _tA.substr(_a.toString().length); if (_tmpA == null || _tmpA == ''){ _tmpA = '0'; } var _tmpB = _tB.substr(_b.toString().length); if (_tmpB == null || _tmpB == ''){ _tmpB = '0'; } return parseInt(_tmpA)-parseInt(_tmpB); }else{ return _a-_b; } } ); alert("排序后数组[" + dest.toString()+"];");}结果:排序前数组[1,15_6,2,012,15_3,3,04,16_1,15+6,18_2];排序后数组[1,2,3,04,012,15_6,15_3,15+6,16_1,18_2]; Java中最简单的实现方法:Comparatorimport java.util.Comparator;public class MyComparator implements Comparator { public int compare(Object o1, Object o2) { return toInt(o1) - toInt(o2); } public boolean equals(Object obj) { return true;// 不必实现 } public static int toInt(Object o) { String str = (String) o; // 消除特殊字符 str = str.replaceAll("_", "");// _ str = str.replaceAll("[+]", "");// + // 最后再消除前面的0 while ("0".equals(str.substring(0, 1))) { str = str.substring(1); } return Integer.parseInt(str); }}测试类:import java.util.Arrays;public class MyComparatorTest { public static void main(String[] args) { String[] source = new String[] { "2", "30", "012", "_0400", "+016_1", "2+5" }; String[] result = new String[source.length]; System.arraycopy(source, 0, result, 0, source.length); //排序 Arrays.sort(result, new MyComparator()); //结果 for (int i = 0; i < source.length; i++) { System.out.println(MyComparator.toInt(result[i]) + " " + result[i] + " " + source[i]); } }}排序结果:对应的数字 结果数组 源数组2 2 212 012 3025 2+5 01230 30 _0400161 +016_1 +016_1400 _0400 2+5 关键不是排序的问题实现一个方法 比如double getNumber(String str){...根据自己的需要写}把字符串转换成根据自己标准转义的double(这个方法可以在Comparator接口中调用)有标准后面就好办了 8楼的代码修改了一下.MyComparator 这个类.import java.util.Comparator;public class MyComparator implements Comparator { public int compare(Object o1, Object o2) { o1 = o1.toString().replaceAll("^([_+0]+)", ""); o2 = o2.toString().replaceAll("^([_+0]+)", ""); String[] s1 = o1.toString().split("[_+]"); String[] s2 = o2.toString().split("[_+]"); if(!s1[0].equals(s2[0])) return Integer.parseInt(s1[0])-Integer.parseInt(s2[0]); else if(s1.length != s2.length) return s1.length-s2.length; else return Integer.parseInt(s1[s1.length-1])-Integer.parseInt(s2[s2.length-1]); }} 关于java生成随机数一些疑问 swing开发 小弟又来了 JAVA中TextField不接收传值的问题与疑惑 这里String创建了几个对象? 关于sqlserver中text 读写问题!向大家请教! 怎么样获取bmp文件的高度和宽度???急急急!!!! http://www.javavsnet.com/bbs/list.aspx?boardid=30 请各位高手帮忙看一下程序: 求涂鸦板程序代码!有的大哥帮帮忙! 那位大侠可以为刚学Java的小弟推荐几本好书?先谢了!!! java多线程 定时任务Timer的问题 JTable设计选择的范围?
再转化成int型循环比较大小
var src = new Array('1','2','012','3','04','16_1','18_2');
alert("排序前数组[" + src.toString()+"];");
var dest = src.sort(
function st(a,b){
return parseInt(a)-parseInt(b);
}
);
alert("排序后数组[" + dest.toString()+"];");
}
结果:
排序前数组[1,2,012,3,04,16_1,18_2]
排序后数组[1,2,3,04,012,16_1,18_2]
其实src和dest都是字符串数组
比如你规定15_6<15_6<15+3,也就是先比较整数(+/-前面的),
如果前面相等,那就比较后面的,_看做-,+看做+,那上面代码进一步改为:function mysort(){
var src = new Array('1','15_6','2','012','15_3','3','04','16_1','15+6','18_2');
alert("排序前数组[" + src.toString()+"];");
var dest = src.sort(
function st(a,b){
if (a == b){
return 0;
}
var _a = parseInt(a);
var _b = parseInt(b);
if (_a == _b){
var _tA = a.replace('_','-');
var _tB = b.replace('_','-');
var _tmpA = _tA.substr(_a.toString().length);
if (_tmpA == null || _tmpA == ''){
_tmpA = '0';
}
var _tmpB = _tB.substr(_b.toString().length);
if (_tmpB == null || _tmpB == ''){
_tmpB = '0';
}
return parseInt(_tmpA)-parseInt(_tmpB);
}else{
return _a-_b;
}
}
);
alert("排序后数组[" + dest.toString()+"];");
}
结果:
排序前数组[1,15_6,2,012,15_3,3,04,16_1,15+6,18_2];
排序后数组[1,2,3,04,012,15_6,15_3,15+6,16_1,18_2];
return toInt(o1) - toInt(o2);
} public boolean equals(Object obj) {
return true;// 不必实现
} public static int toInt(Object o) {
String str = (String) o;
// 消除特殊字符
str = str.replaceAll("_", "");// _
str = str.replaceAll("[+]", "");// +
// 最后再消除前面的0
while ("0".equals(str.substring(0, 1))) {
str = str.substring(1);
}
return Integer.parseInt(str);
}}测试类:import java.util.Arrays;public class MyComparatorTest {
public static void main(String[] args) {
String[] source = new String[] { "2", "30", "012", "_0400", "+016_1", "2+5" };
String[] result = new String[source.length];
System.arraycopy(source, 0, result, 0, source.length);
//排序
Arrays.sort(result, new MyComparator());
//结果
for (int i = 0; i < source.length; i++) {
System.out.println(MyComparator.toInt(result[i]) + " " + result[i]
+ " " + source[i]);
}
}
}排序结果:
对应的数字 结果数组 源数组
2 2 2
12 012 30
25 2+5 012
30 30 _0400
161 +016_1 +016_1
400 _0400 2+5
实现一个方法 比如
double getNumber(String str){...根据自己的需要写}
把字符串转换成根据自己标准转义的double(这个方法可以在Comparator接口中调用)
有标准后面就好办了
import java.util.Comparator;public class MyComparator implements Comparator { public int compare(Object o1, Object o2) {
o1 = o1.toString().replaceAll("^([_+0]+)", "");
o2 = o2.toString().replaceAll("^([_+0]+)", ""); String[] s1 = o1.toString().split("[_+]");
String[] s2 = o2.toString().split("[_+]");
if(!s1[0].equals(s2[0]))
return Integer.parseInt(s1[0])-Integer.parseInt(s2[0]);
else if(s1.length != s2.length)
return s1.length-s2.length;
else
return Integer.parseInt(s1[s1.length-1])-Integer.parseInt(s2[s2.length-1]);
}}