含有数字的字符串比较大小

tyfg006 2014-01-15 12:41:32
str1="12-a-33";
str2="5-b";
str3="a-5-b";
str4="12-a-c";
str5="12-b-7";
例如:
str1和str2比较,12大于5,那么str1<str2;
str1和str3比较,a的ascii码小于1的,那么str3<str1;
str4和str5比较,a的ascii码小于b的,那么str4<str5;
逐一比较后的顺序为:
a-5-b
5-b
12-a-c
12-a-7
12-a-33
如何用java代码完成上述排序结果?
...全文
1996 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tyfg006 2014-01-18
  • 打赏
  • 举报
回复
我自己已经排好了。代码分享给大家。

public int sortRule(String str1,String str2){
		str1=str1.replaceAll("(\\D+)","@$1@");
		str1=("@".equals(str1.substring(0,1)))?str1.substring(1,str1.length()):str1;
		str1=("@".equals(str1.substring(str1.length()-1,str1.length())))?str1.substring(0,str1.length()-1):str1;
		String[] num1=str1.split("@");

		str2=str2.replaceAll("(\\D+)","@$1@");
		str2=("@".equals(str2.substring(0,1)))?str2.substring(1,str2.length()):str2;
		str2=("@".equals(str2.substring(str2.length()-1,str2.length())))?str2.substring(0,str2.length()-1):str2;
		String[] num2=str2.split("@");
		int count=(num1.length-num2.length<0)?num1.length:num2.length;
		int n=0;
		int i=0;
		int res=0;
		do{
			Pattern p=Pattern.compile("[0-9]{1,}");
			Matcher m1=p.matcher(num1[i]);
			boolean bl1=m1.matches();
			Matcher m2=p.matcher(num2[i]);
			boolean bl2=m2.matches();
			if(bl1==true&&bl2==true){
				int n1=Integer.parseInt(num1[i]);
				int n2=Integer.parseInt(num2[i]);
				n=n1-n2;
			}else{
				n=num1[i].compareTo(num2[i]);
			}
			if(n==0){
				if(i==count-1){
					if(num1.length<num2.length){
						res=-1;
					}else if(num1.length>num2.length){
						res=1;
					}else{
						res=0;
					}
				}
			}else{
				res=n;
			}
			i++;
		}while(n==0&&i<=count-1);
		return res;	
	}
tyfg006 2014-01-18
  • 打赏
  • 举报
回复
引用 2 楼 suciver 的回复:
楼主这个根本就是自然的字符串比较顺序啊,利用TreeSet这个自然的排序集合

String str1="12-a-33",str2="5-b",str3="a-5-b",str4="12-a-c",str5="12-b-7";
//由于TreeSet默认的是从小到大的,所以我们用一个Comparator给他倒序下
TreeSet<String> set=new TreeSet<String>(new Comparator<String>(){
        @Override
	public int compare(String o1, String o2) {
		return -o1.compareTo(o2);
	}
});
set.add(str1);
set.add(str2);
set.add(str3);
set.add(str4);
set.add(str5);
System.out.println(set);
这个方法不管用的,我举例的字符串凑巧是符合return -(str1).compareTo(str2),不过还是谢谢。
流氓T-T兔 2014-01-16
  • 打赏
  • 举报
回复
a的ASC码>1的Asc 字符串比较的时候 是按照char字符比较的 所以str1和str2比较,应该是1<5,str1<str2
1046838702 2014-01-16
  • 打赏
  • 举报
回复
引用 6 楼 kakashi8841 的回复:
[quote=引用 5 楼 u013429280 的回复:] [quote=引用 2 楼 suciver 的回复:] 楼主这个根本就是自然的字符串比较顺序啊,利用TreeSet这个自然的排序集合

String str1="12-a-33",str2="5-b",str3="a-5-b",str4="12-a-c",str5="12-b-7";
//由于TreeSet默认的是从小到大的,所以我们用一个Comparator给他倒序下
TreeSet<String> set=new TreeSet<String>(new Comparator<String>(){
        @Override
	public int compare(String o1, String o2) {
		return -o1.compareTo(o2);
	}
});
set.add(str1);
set.add(str2);
set.add(str3);
set.add(str4);
set.add(str5);
System.out.println(set);
您好,请问为什么在return 后面的表达式加了"-"就会改变排序的方式啊[/quote] 因为TreeMap(TreeSet内部其实是组合了TreeMap)加入元素的时候,如果Comparator不为null(上面代码即不为null,构造方法已经传入)。会调用Comparator的compare方法比较两个键,第一个键永远为当前准备加入的,第二个键是树中当前结点的键(循环至叶子结点为止)。然后把compare小于0时,返回当前结点的左结点,>0则返回右结点。(这样主要是保证左结点永远小于右结点)。[/quote] 谢谢您的解释啊,虽然不是很懂,但还是了解一下原理。
kakashi8841 2014-01-16
  • 打赏
  • 举报
回复
引用 5 楼 u013429280 的回复:
[quote=引用 2 楼 suciver 的回复:] 楼主这个根本就是自然的字符串比较顺序啊,利用TreeSet这个自然的排序集合

String str1="12-a-33",str2="5-b",str3="a-5-b",str4="12-a-c",str5="12-b-7";
//由于TreeSet默认的是从小到大的,所以我们用一个Comparator给他倒序下
TreeSet<String> set=new TreeSet<String>(new Comparator<String>(){
        @Override
	public int compare(String o1, String o2) {
		return -o1.compareTo(o2);
	}
});
set.add(str1);
set.add(str2);
set.add(str3);
set.add(str4);
set.add(str5);
System.out.println(set);
您好,请问为什么在return 后面的表达式加了"-"就会改变排序的方式啊[/quote] 因为TreeMap(TreeSet内部其实是组合了TreeMap)加入元素的时候,如果Comparator不为null(上面代码即不为null,构造方法已经传入)。会调用Comparator的compare方法比较两个键,第一个键永远为当前准备加入的,第二个键是树中当前结点的键(循环至叶子结点为止)。然后把compare小于0时,返回当前结点的左结点,>0则返回右结点。(这样主要是保证左结点永远小于右结点)。
1046838702 2014-01-16
  • 打赏
  • 举报
回复
引用 2 楼 suciver 的回复:
楼主这个根本就是自然的字符串比较顺序啊,利用TreeSet这个自然的排序集合

String str1="12-a-33",str2="5-b",str3="a-5-b",str4="12-a-c",str5="12-b-7";
//由于TreeSet默认的是从小到大的,所以我们用一个Comparator给他倒序下
TreeSet<String> set=new TreeSet<String>(new Comparator<String>(){
        @Override
	public int compare(String o1, String o2) {
		return -o1.compareTo(o2);
	}
});
set.add(str1);
set.add(str2);
set.add(str3);
set.add(str4);
set.add(str5);
System.out.println(set);
您好,请问为什么在return 后面的表达式加了"-"就会改变排序的方式啊
Mourinho 2014-01-15
  • 打赏
  • 举报
回复
字符串格式确定为"xx-xx-xx-xx"?
suciver 2014-01-15
  • 打赏
  • 举报
回复
楼主这个根本就是自然的字符串比较顺序啊,利用TreeSet这个自然的排序集合

String str1="12-a-33",str2="5-b",str3="a-5-b",str4="12-a-c",str5="12-b-7";
//由于TreeSet默认的是从小到大的,所以我们用一个Comparator给他倒序下
TreeSet<String> set=new TreeSet<String>(new Comparator<String>(){
        @Override
	public int compare(String o1, String o2) {
		return -o1.compareTo(o2);
	}
});
set.add(str1);
set.add(str2);
set.add(str3);
set.add(str4);
set.add(str5);
System.out.println(set);
coolbamboo2008 2014-01-15
  • 打赏
  • 举报
回复
人家比较的是1和5,而不是想当然的12 至于要像你那样排序,那就得在排序算法中,分解开-分割的部分,看是什么类型再比较

62,614

社区成员

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

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