很难的数字排序问题

WillSmart 2008-01-15 07:47:30
我想做个排序,假设有一组数里面包含('1','2','012','3','04',还有'16_1','18_2')等字符串
要求得到排序结果'1','2','3','04','012','16_1','18_2'.
主要是数据遗留问题.感觉很难做.希望高手帮忙.谢谢!
...全文
329 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
shan1119 2008-01-18
  • 打赏
  • 举报
回复
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]);

}

}
zhuode_001 2008-01-17
  • 打赏
  • 举报
回复
全是牛人
ybyb14 2008-01-17
  • 打赏
  • 举报
回复
不错,学习了
JadoNet 2008-01-16
  • 打赏
  • 举报
回复
改成小数点,比较不错的选择
WillSmart 2008-01-16
  • 打赏
  • 举报
回复
'17'大,排在'16_1'后面
shan1119 2008-01-16
  • 打赏
  • 举报
回复
'16_1'和'17'比较,谁大.
WillSmart 2008-01-16
  • 打赏
  • 举报
回复
恩,谢谢大家了.
KK3K2005 2008-01-15
  • 打赏
  • 举报
回复
关键不是排序的问题
实现一个方法 比如
double getNumber(String str){...根据自己的需要写}
把字符串转换成根据自己标准转义的double(这个方法可以在Comparator接口中调用)
有标准后面就好办了
fastunit 2008-01-15
  • 打赏
  • 举报
回复
Java中最简单的实现方法:Comparator

import 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 2
12 012 30
25 2+5 012
30 30 _0400
161 +016_1 +016_1
400 _0400 2+5
daniel_kaka 2008-01-15
  • 打赏
  • 举报
回复
对于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];
daniel_kaka 2008-01-15
  • 打赏
  • 举报
回复
说明一下,结果中不带引号是因为src.toString()的缘故;
其实src和dest都是字符串数组
daniel_kaka 2008-01-15
  • 打赏
  • 举报
回复
用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]
dext 2008-01-15
  • 打赏
  • 举报
回复
这个很简单,用一个类包装继承Comparable就可以了。

有什么难的地方?

最麻烦的也就是 麻烦的应该是有没有 15_3 , 15_6这种问题

妈的,只有一位的话,改成小数点。
WillSmart 2008-01-15
  • 打赏
  • 举报
回复
对,是有15_3,15_6而且还有15_3,15+4,这种问题.因为用户在输入的时候没有进行控制所以导致现在数据格式不统一.比较麻烦.假设我已经取到一组字符串型的数字放入了List当中.如何过滤?谢谢!
frilly 2008-01-15
  • 打赏
  • 举报
回复
字符串数组的话,用replace()或者 replaceAll(),把非数字替换成"",
再转化成int型循环比较大小
宋玮-深圳 2008-01-15
  • 打赏
  • 举报
回复
首先分成2组: 1组是能直接转int的,另一组带"_"的。各自求值问题应该不大

麻烦的应该是有没有 15_3 , 15_6这种问题

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧