Java字母加数字组合比较大小

 更新时间:2016年06月14日 10:31:36   作者:kingxss  
这篇文章主要通过实现Comarable接口来比较(如"a20"和"a9"这种)字符串的大小,希望能给大家做一个参考。

  针对字符串是数字和字母结合而进行的,如"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连接Oracle数据库实例解析

    Java连接Oracle数据库实例解析

    数据库的操作是当前系统开发必不可少的开发部分之一。接下来通过本文给大家介绍Java连接Oracle数据库实例解析,非常不错具有参考借鉴价值,感兴趣的朋友一起学习吧
    2016-06-06
  • Java8新特性-Lambda表达式详解

    Java8新特性-Lambda表达式详解

    Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。本文通过详细的代码示例介绍了Java8新特性感兴趣的朋友可以参考一下
    2023-04-04
  • java 排序算法之快速排序

    java 排序算法之快速排序

    这篇文章主要介绍了java 排序算法之快速排序,文中通过图片和代码讲解相关知识非常详细,大家如果有需要的话可以参考一下这篇文章
    2021-09-09
  • Java读取数据库表的示例代码

    Java读取数据库表的示例代码

    这篇文章主要介绍了Java读取数据库表,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • Java动态代理的两种实现方式详解【附相关jar文件下载】

    Java动态代理的两种实现方式详解【附相关jar文件下载】

    这篇文章主要介绍了Java动态代理的两种实现方式,结合实例形式分析了java动态代理的相关原理、实现方法与操作技巧,并附带相关jar文件供读者下载,需要的朋友可以参考下
    2019-03-03
  • Java EE项目中的异常处理总结(一篇不得不看的文章)

    Java EE项目中的异常处理总结(一篇不得不看的文章)

    什么是异常?运行时发生的可被捕获和处理的错误。这篇文章主要介绍了Java EE项目中的异常处理总结,有需要的可以了解一下。
    2016-11-11
  • SpringBoot如何使用@Aspect注解实现AOP

    SpringBoot如何使用@Aspect注解实现AOP

    这篇文章主要介绍了SpringBoot如何使用@Aspect注解实现AOP问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 解决Spring Data Jpa 实体类自动创建数据库表失败问题

    解决Spring Data Jpa 实体类自动创建数据库表失败问题

    这篇文章主要介绍了解决Spring Data Jpa 实体类自动创建数据库表失败问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • java内部类的那些事儿_让你一看就弄明白

    java内部类的那些事儿_让你一看就弄明白

    本篇文章介绍了,java内部类的那些事儿。需要的朋友参考下
    2013-05-05
  • Spring MVC的参数绑定和返回值问题

    Spring MVC的参数绑定和返回值问题

    这篇文章主要介绍了Spring MVC的参数绑定和返回值问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02

最新评论