สำหรับสตริงการรวมกันของตัวเลขและตัวอักษรเช่น "A20" และ "A9"; ผลลัพธ์คือ "A20"> "A9" ในกรณีนี้ผลลัพธ์ของการเรียกใช้วิธีการเปรียบเทียบสตริงไม่ใช่สิ่งที่เราหวัง ในเวลานี้คุณต้องเขียนคลาสของคุณเองและใช้อินเทอร์เฟซที่สามารถเปรียบเทียบได้ นี่เป็นคำถามสัมภาษณ์ตั้งแต่ครั้งแรก แต่มีความคิดเพียงอย่างเดียวในเวลานั้น
แนวคิด:
1. แปลงสตริงเป็นรายการที่มีสตริงย่อยและจำนวนเต็ม (ฉันไม่รู้วิธีแยกมันโดยตรงโดยใช้วิธีการพ่นของสตริงที่นี่?)
2. เปรียบเทียบข้อมูลรายการ
3. หากการเปรียบเทียบผลลัพธ์ในรายการมีค่าเท่ากันแล้วการเปรียบเทียบสตริงของสตริง
การใช้รหัส:
แพ็คเกจทดสอบ นำเข้า java.util.arraylist; นำเข้า java.util.list; / ** * * @Author WASTON XU * @DATE 2011-4-15 10:48:21 AM */ คลาสสาธารณะ MyString ดำเนินการเปรียบเทียบ <MyString> {สตริงสตริงสุดท้ายส่วนตัว; รายการส่วนตัว <Ojrop> รายการ; สาธารณะ myString (สตริงสตริง) {this.string = string; trimstring2list (); } โมฆะส่วนตัว TriMString2List () {list = new ArrayList <Object> (); จำนวนเต็ม num = 0; StringBuffer sb = new StringBuffer (); สำหรับ (int i = 0; i <this.string.length (); i ++) {char c = this.string.charat (i); if (c> 47 && c <58) {ถ้า (sb.length ()! = 0) {list.add (sb); sb = new StringBuffer (); } num = num * 10 + (c - '0'); ดำเนินการต่อ; } else {ถ้า (num! = 0) {list.add (num); num = 0; } sb.append (c); ดำเนินการต่อ; }} if (sb.length ()! = 0) {list.add (sb); sb = new StringBuffer (); } อื่นถ้า (num! = 0) {list.add (num); num = 0; }} / * * หลังจากดูวิธีการเปรียบเทียบของสตริงอย่างระมัดระวังฉันวางแผนไว้ว่าไม่เรียก API สำหรับการเขียนโปรแกรม * อย่างไรก็ตามเมื่อพิจารณาถึงการเกิดขึ้นของกรณี "A02" และ "A2" ฉันยังคงใช้วิธีการใน API เพื่อแก้ปัญหา */ private int comperetolikestring (สตริง s) {int len1 = string.length (); int len2 = s.length (); int n = math.min (len1, len1); if (n> 0) {int k = 0; ในขณะที่ (k <n) {char c1 = string.charat (k); ถ่าน C2 = S.Charat (K); if (c1! = c2) ส่งคืน c1 - c2; K ++; }} ส่งคืน len1 - len2; } @Override public int compereto (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; ในขณะที่ (i <n) {object o1 = list.get (i); Object O2 = anotherstring.list.get (i); ถ้า (O1 อินสแตนซ์ของจำนวนเต็ม && O2 อินสแตนซ์ของจำนวนเต็ม) {mark = (จำนวนเต็ม) O1 - (จำนวนเต็ม) O2; } else {mark = o1.toString (). compereto (o2.toString ()); } if (mark! = 0) return mark; i ++; }} return comperetolikestring (anotherstring.string); // return String.Compareto (anotherstring.string); / * หากคุณเขียนด้วยวิธีนี้จะมีข้อเสียที่ว่า "A02" และ "A2" มันจะต้องเป็นขนาดเล็ก */// return String.length () - anothertring.string.length (); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {สตริง s1 = "b9c"; สตริง s2 = "b09c"; mystring m1 = mystring ใหม่ (S1); mystring m2 = mystring ใหม่ (S2); System.out.println (M1.Compareto (M2)); -หากต้องการดูไวยากรณ์ Java เพิ่มเติมคุณสามารถติดตามได้: "การคิดในคู่มือจีน Java", "JDK 1.7 คู่มือการอ้างอิงอย่างเป็นทางการภาษาอังกฤษ", "JDK 1.6 API Java คู่มืออ้างอิงจีน", "JDK 1.5 API Java คู่มืออ้างอิงจีน" ฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น