針對字符串是數字和字母結合而進行的,如"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 中文參考手冊》,也希望大家多多支持武林網。
新聞熱點
疑難解答