Fairy
逼着你往前走的,不是前方梦想的微弱光芒,而是身后现实的万丈深渊。 ---------致自己

Java 字符排序问题

未专注于排序算法,而是写了一个MyString类,实现了comparable的接口,然后用Arrays的sort方法来实现排序。我觉得这道题的难度在于如果比较两个。因为大小写的关系,实现起来有点复杂。

这是类一

 

  1. import java.util.Arrays;
  2. /*1.对字符串进行排序,用任意一种编程语言来实现,不能使用现有的类,在排序中,
  3. 字符串“Bc”,“Ad”,“aC”,“Hello”,“X man”,“little”,“During”,“day”
  4. 能够排序成 “Ad”,"aC",“Bc”,“During”,“day”,“Hello”,“little”,“Hello”,
  5. 也就是说,在排序的过程并不是传统的按照字符串排序,在排序中还需要将小写字母一并排序,
  6. 也就是说a字符串要在B或b之前。*/
  7. public class LetterSort {
  8.     public static void main(String[] args) {
  9.         // TODO Auto-generated method stub
  10.         String[] str = { "dad", 
  11.                          "bOod",
  12.                          "bada","Admin","Good","aete","cc","Ko","Beta","Could"}; 
  13.         MyString[] strcompare = new MyString[str.length];
  14.         for(int i = 0;i<str.length;i++){
  15.             strcompare[i] = new MyString(str[i]);
  16.         }
  17.         Arrays.sort(strcompare);
  18.         for(MyString string:strcompare){
  19.             System.out.println(string);
  20.         }
  21.     }
  22. }

实现接口的MyString

  1. /*这个类是封装了一个String。实现Comparable接口。这样使得可以用Arrays的sort方法进行排序*/
  2. public class MyString implements Comparable<MyString> {
  3.     private String string;
  4.     
  5.     public void setString(String string) {
  6.         this.string = string;
  7.     }
  8.     public String getString() {
  9.         return string;
  10.     }
  11.     //构造方法
  12.     public MyString(String string){
  13.         this.string = string;
  14.     }
  15.     
  16.     
  17.     
  18.     //比较
  19.     public int compareTo(MyString other) {
  20.         // TODO Auto-generated method stub
  21.         char[] thisarr = this.string.toCharArray();        //存储被包装  字符串的字符数组
  22.         
  23.         char[] otherarr = other.getString().toCharArray(); //存储要比较的字符串的字符数组
  24.         
  25.         /*取得循环次数,为两个字符串的长度的最小值*/
  26.         int iterate = thisarr.length<otherarr.length?thisarr.length:otherarr.length;
  27.         
  28.         boolean mlowercase;                                 //记录被封装的字符串循环到的字符是否为小写
  29.         
  30.         boolean olowercase;                                 //记录要比较的字符串循环到的字符是否为小写                               
  31.         
  32.         char    thisletter;                                 //记录被封装的字符串循环到的字符
  33.         
  34.         char    otherletter;                                //记录要比较的字符串循环到的字符 
  35.         
  36.         /*字符串相等,则返回0*/
  37.         if(this.getString().equals(other.getString())){
  38.             return 0;
  39.         }
  40.         
  41.         /*循环字符串,做比较*/
  42.         for(int i=0;i<iterate;i++){
  43.             mlowercase = this.isLowercase(thisarr[i]);        
  44.             olowercase = this.isLowercase(otherarr[i]);
  45.             
  46.             /*把比较字符变成大写*/
  47.             thisletter = mlowercase?(char)(thisarr[i]-32):thisarr[i]; 
  48.             otherletter = olowercase?(char)(otherarr[i]-32):otherarr[i];
  49.             
  50.             /*比较*/
  51.             if(thisletter!=otherletter){               //比较字母大小,不相等,则取差值,字母小的在前面
  52.                 return (thisletter-otherletter);
  53.             }else{                                     //字母的大写形式相同
  54.                 if(mlowercase == olowercase){          //此位置大小写形式相同,判断下一个字符;
  55.                     continue;
  56.                 }else if(mlowercase){                  //被封装的字符为小写,则返回负值
  57.                     return 32;
  58.                 }else if(olowercase){                  //比较字符串的字符为小写,则返回正直
  59.                     return -32;
  60.                 }
  61.             }
  62.             
  63.         }
  64.         
  65.         /*如果循环好之后还分不出大小,则小的排在后面*/
  66.         return (thisarr.length<otherarr.length?-1:1);
  67.     }
  68.     
  69.     @Override
  70.     public String toString() {
  71.         // TODO Auto-generated method stub
  72.         return string;
  73.     }
  74.     //通过码值,来判断字符是否为小写字母
  75.     private boolean isLowercase(char ch){
  76.         if((int)ch >=97 && (int)ch<=122){
  77.             return true;
  78.         }else{
  79.             return false;
  80.         }
  81.     }
  82. }

posted on 2016-12-20 15:52  Fairy-02  阅读(5472)  评论(0编辑  收藏  举报