Java 字符排序問題
未專注於排序算法,而是寫了一個MyString類,實現了comparable的接口,然后用Arrays的sort方法來實現排序。我覺得這道題的難度在於如果比較兩個。因為大小寫的關系,實現起來有點復雜。
這是類一
- import java.util.Arrays;
- /*1.對字符串進行排序,用任意一種編程語言來實現,不能使用現有的類,在排序中,
- 字符串“Bc”,“Ad”,“aC”,“Hello”,“X man”,“little”,“During”,“day”
- 能夠排序成 “Ad”,"aC",“Bc”,“During”,“day”,“Hello”,“little”,“Hello”,
- 也就是說,在排序的過程並不是傳統的按照字符串排序,在排序中還需要將小寫字母一並排序,
- 也就是說a字符串要在B或b之前。*/
- public class LetterSort {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- String[] str = { "dad",
- "bOod",
- "bada","Admin","Good","aete","cc","Ko","Beta","Could"};
- MyString[] strcompare = new MyString[str.length];
- for(int i = 0;i<str.length;i++){
- strcompare[i] = new MyString(str[i]);
- }
- Arrays.sort(strcompare);
- for(MyString string:strcompare){
- System.out.println(string);
- }
- }
- }
實現接口的MyString
- /*這個類是封裝了一個String。實現Comparable接口。這樣使得可以用Arrays的sort方法進行排序*/
- public class MyString implements Comparable<MyString> {
- private String string;
- public void setString(String string) {
- this.string = string;
- }
- public String getString() {
- return string;
- }
- //構造方法
- public MyString(String string){
- this.string = string;
- }
- //比較
- public int compareTo(MyString other) {
- // TODO Auto-generated method stub
- char[] thisarr = this.string.toCharArray(); //存儲被包裝 字符串的字符數組
- char[] otherarr = other.getString().toCharArray(); //存儲要比較的字符串的字符數組
- /*取得循環次數,為兩個字符串的長度的最小值*/
- int iterate = thisarr.length<otherarr.length?thisarr.length:otherarr.length;
- boolean mlowercase; //記錄被封裝的字符串循環到的字符是否為小寫
- boolean olowercase; //記錄要比較的字符串循環到的字符是否為小寫
- char thisletter; //記錄被封裝的字符串循環到的字符
- char otherletter; //記錄要比較的字符串循環到的字符
- /*字符串相等,則返回0*/
- if(this.getString().equals(other.getString())){
- return 0;
- }
- /*循環字符串,做比較*/
- for(int i=0;i<iterate;i++){
- mlowercase = this.isLowercase(thisarr[i]);
- olowercase = this.isLowercase(otherarr[i]);
- /*把比較字符變成大寫*/
- thisletter = mlowercase?(char)(thisarr[i]-32):thisarr[i];
- otherletter = olowercase?(char)(otherarr[i]-32):otherarr[i];
- /*比較*/
- if(thisletter!=otherletter){ //比較字母大小,不相等,則取差值,字母小的在前面
- return (thisletter-otherletter);
- }else{ //字母的大寫形式相同
- if(mlowercase == olowercase){ //此位置大小寫形式相同,判斷下一個字符;
- continue;
- }else if(mlowercase){ //被封裝的字符為小寫,則返回負值
- return 32;
- }else if(olowercase){ //比較字符串的字符為小寫,則返回正直
- return -32;
- }
- }
- }
- /*如果循環好之后還分不出大小,則小的排在后面*/
- return (thisarr.length<otherarr.length?-1:1);
- }
- @Override
- public String toString() {
- // TODO Auto-generated method stub
- return string;
- }
- //通過碼值,來判斷字符是否為小寫字母
- private boolean isLowercase(char ch){
- if((int)ch >=97 && (int)ch<=122){
- return true;
- }else{
- return false;
- }
- }
- }