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;
- }
- }
- }