针对字符串是数字和字母结合而进行的比较
?????? 针对字符串是数字和字母结合而进行的,如"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;}@Overridepublic 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));}}?