Java字母加数字组合比较大小
作者:kingxss 时间:2023-02-27 15:27:52
针对字符串是数字和字母结合而进行的,如"a20"和"a9";比较而得出结果是"a20">"a9"。这种情况直接调用String的compareTo方法得出的结果是不是我们希望的。这个时候就需要写自己的类并且实现Comarable接口来进行比较。这个是来源一次的面试题目,但是当时只有个思路。
思路:
1.转换String为包含substring和Integer的list。(这里用String的spit方法直接拆分不知道怎么做?)
2.将list的数据进行比较。
3.如果list中的比较结果相等,再调用String的compareTo。
代码实现:
package testsource;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author Waston Xu
* @date 2011-4-15 上午10:48:21
*/
public class MyString implements Comparable<MyString> {
private final String string;
private List<Object> list;
public MyString(String string) {
this.string = string;
trimString2List();
}
private void trimString2List() {
list = new ArrayList<Object>();
Integer num = 0;
StringBuffer sb = new StringBuffer();
for (int i = 0; i < this.string.length(); i++) {
char c = this.string.charAt(i);
if (c > 47 && c < 58) {
if (sb.length() != 0) {
list.add(sb);
sb = new StringBuffer();
}
num = num * 10 + (c - '0');
continue;
} else {
if (num != 0) {
list.add(num);
num = 0;
}
sb.append(c);
continue;
}
}
if (sb.length() != 0) {
list.add(sb);
sb = new StringBuffer();
} else if (num != 0) {
list.add(num);
num = 0;
}
}
/*
* 在仔细的观看了String的compareTo方法后,本来打算不调用其API进行编程,
* 但是考虑到出现"a02"和"a2"这样的情况还是使用其API中的方式解决。
*/
private int compareToLikeString(String s) {
int len1 = string.length();
int len2 = s.length();
int n = Math.min(len1, len1);
if (n > 0) {
int k = 0;
while (k < n) {
char c1 = string.charAt(k);
char c2 = s.charAt(k);
if (c1 != c2)
return c1 - c2;
k++;
}
}
return len1 - len2;
}
@Override
public int compareTo(MyString anotherString) {
int len1 = list.size();
int len2 = anotherString.list.size();
int n = Math.min(len1, len2);
int mark = 0;
if (n > 0) {
int i = 0;
while (i < n) {
Object o1 = list.get(i);
Object o2 = anotherString.list.get(i);
if (o1 instanceof Integer && o2 instanceof Integer) {
mark = (Integer) o1 - (Integer) o2;
} else {
mark = o1.toString().compareTo(o2.toString());
}
if (mark != 0)
return mark;
i++;
}
}
return compareToLikeString(anotherString.string);
//return string.compareTo(anotherString.string);
/* 如果这样写会有个弊端就是出现"a02"和"a2"这样的情况,肯定是前面的小*/
//return string.length() - anotherString.string.length();
}
public static void main(String[] args) {
String s1 = "b9c";
String s2 = "b09c";
MyString m1 = new MyString(s1);
MyString m2 = new MyString(s2);
System.out.println(m1.compareTo(m2));
}
}
查看更多Java的语法,大家可以关注:《Thinking in Java 中文手册》、《JDK 1.7 参考手册官方英文版》、《JDK 1.6 API java 中文参考手册》、《JDK 1.5 API java 中文参考手册》,也希望大家多多支持脚本之家。
标签:Java,字母,数字
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
C# Websocket连接实现wss协议
2022-09-02 08:20:41
springboot配置aop切面日志打印过程解析
2022-07-10 13:14:09
SpringBoot深入了解日志的使用
2023-01-06 15:40:34
![](https://img.aspxhome.com/file/2023/7/65177_0s.png)
AjaxControlToolkit AjaxFileUpload 显示英文改成中文的解决方法
2021-06-01 21:09:57
![](https://img.aspxhome.com/file/2023/5/106425_0s.gif)
C#实现缩放字体的方法
2021-08-25 23:47:51
C# Winform实现进度条显示
2023-09-14 15:47:51
![](https://img.aspxhome.com/file/2023/9/68609_0s.png)
flutter升级3.7.3报错Unable to find bundled Java version解决
2023-07-29 16:57:52
![](https://img.aspxhome.com/file/2023/9/116149_0s.jpg)
改进c# 代码的五个技巧(二)
2023-01-09 08:57:56
![](https://img.aspxhome.com/file/2023/2/104222_0s.png)
15个顶级Java多线程面试题(附答案)
2023-11-24 01:53:44
分享java中设置代理的两种方式
2023-10-28 10:48:52
![](https://img.aspxhome.com/file/2023/0/67640_0s.png)
IDEA的默认快捷键设置与Eclipse的常用快捷键的设置方法
2023-04-09 18:32:40
![](https://img.aspxhome.com/file/2023/7/78007_0s.png)
JAVA关键字及作用详解
2022-05-03 03:50:14
Java方法的返回值及注意事项小结
2022-10-02 16:55:28
简述Java图像倾斜方法及实例 <font color=red>原创</font>
2023-08-16 09:38:47
关于Java反编译字节码文件
2021-10-07 01:41:32
关于Spring Boot内存泄露排查的记录
2023-06-27 18:46:19
![](https://img.aspxhome.com/file/2023/1/57591_0s.jpg)
Android Studio 超级简单的打包生成apk的方法
2023-08-07 18:57:28
![](https://img.aspxhome.com/file/2023/6/118926_0s.png)
解决FeignClient重试机制造成的接口幂等性
2022-01-25 11:10:35
Jackson序列化和反序列化忽略字段操作
2022-08-29 14:01:14
Java多线程死锁与资源限制操作
2023-08-31 05:54:30