Java字母加數(shù)字組合比較大小
針對(duì)字符串是數(shù)字和字母結(jié)合而進(jìn)行的,如"a20"和"a9";比較而得出結(jié)果是"a20">"a9"。這種情況直接調(diào)用String的compareTo方法得出的結(jié)果是不是我們希望的。這個(gè)時(shí)候就需要寫自己的類并且實(shí)現(xiàn)Comarable接口來(lái)進(jìn)行比較。這個(gè)是來(lái)源一次的面試題目,但是當(dāng)時(shí)只有個(gè)思路。
思路:
1.轉(zhuǎn)換String為包含substring和Integer的list。(這里用String的spit方法直接拆分不知道怎么做?)
2.將list的數(shù)據(jù)進(jìn)行比較。
3.如果list中的比較結(jié)果相等,再調(diào)用String的compareTo。
代碼實(shí)現(xiàn):
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; } } /* * 在仔細(xì)的觀看了String的compareTo方法后,本來(lái)打算不調(diào)用其API進(jìn)行編程, * 但是考慮到出現(xiàn)"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); /* 如果這樣寫會(huì)有個(gè)弊端就是出現(xiàn)"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的語(yǔ)法,大家可以關(guān)注:《Thinking in Java 中文手冊(cè)》、《JDK 1.7 參考手冊(cè)官方英文版》、《JDK 1.6 API java 中文參考手冊(cè)》、《JDK 1.5 API java 中文參考手冊(cè)》,也希望大家多多支持腳本之家。
- Java實(shí)現(xiàn)的Excel列號(hào)數(shù)字與字母互相轉(zhuǎn)換功能
- Java簡(jiǎn)單統(tǒng)計(jì)字符串中漢字,英文字母及數(shù)字?jǐn)?shù)量的方法
- Java統(tǒng)計(jì)輸入字符的英文字母、空格、數(shù)字和其它
- Java生成含字母和數(shù)字的6位隨機(jī)字符串
- Java正則表達(dá)式過(guò)濾出字母、數(shù)字和中文
- java生成字母數(shù)字組合的隨機(jī)數(shù)示例 java生成隨機(jī)數(shù)
- Java 隨機(jī)生成驗(yàn)證碼(支持大小寫字母、數(shù)字、隨機(jī)字體)的實(shí)例
- java基礎(chǔ)-給出一個(gè)隨機(jī)字符串,判斷有多少字母?多少數(shù)字?
相關(guān)文章
springboot發(fā)送郵件功能的實(shí)現(xiàn)代碼
發(fā)郵件是一個(gè)很常見的功能,在java中實(shí)現(xiàn)需要依靠JavaMailSender這個(gè)接口,今天通過(guò)本文給大家分享springboot發(fā)送郵件功能的實(shí)現(xiàn)代碼,感興趣的朋友跟隨小編一起看看吧2021-07-07SpringMVC 方法四種類型返回值總結(jié)(你用過(guò)幾種)
這篇文章主要介紹了SpringMVC 方法四種類型返回值總結(jié)(你用過(guò)幾種),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05springboot結(jié)合maven實(shí)現(xiàn)多模塊打包
本文主要介紹了springboot借助maven完成多模塊打包,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04SpringBoot熱部署和整合Mybatis的過(guò)程
熱部署,就是在應(yīng)用正在運(yùn)行的時(shí)候升級(jí)軟件,卻不需要重新啟動(dòng)應(yīng)用,本文給大家詳細(xì)介紹SpringBoot熱部署和整合Mybatis的過(guò)程,感興趣的朋友跟隨小編一起看看吧2023-10-10SpringCloud?@RefreshScope刷新機(jī)制淺析
RefeshScope這個(gè)注解想必大家都用過(guò),在微服務(wù)配置中心的場(chǎng)景下經(jīng)常出現(xiàn),他可以用來(lái)刷新Bean中的屬性配置,那大家對(duì)他的實(shí)現(xiàn)原理了解嗎?它為什么可以做到動(dòng)態(tài)刷新呢2023-03-03SpringBoot單元測(cè)試之?dāng)?shù)據(jù)隔離詳解
我們?cè)趯憜卧獪y(cè)試時(shí),有一個(gè)比較重要的要求是可以重復(fù)運(yùn)行, 那么這樣就會(huì)有一個(gè)比較麻煩的問(wèn)題:數(shù)據(jù)污染,所以本文為大家整理了兩個(gè)數(shù)據(jù)隔離的方式,希望對(duì)大家有所幫助2023-08-08Java并發(fā)教程之volatile關(guān)鍵字詳解
這篇文章主要給大家介紹了關(guān)于Java并發(fā)教程之volatile關(guān)鍵字的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11