簡體   English   中英

使用遞歸比較兩個String(不區分大小寫)

[英]Compare two String using recursion (case insensitive)

我需要編寫一個遞歸方法來使用字母順序比較兩個字符串,而不使用compareTo。

string1 comes before string2 returns an integer less than 0
string1 == (or indistinguishable from) string2 returns 0
string1 comes after string2 returns an integer greater than 0

我編寫了一種效果很好的方法,問題是,如果我將兩個相似的字符串或一個字符串與自身進行比較,它將返回1而不是0。

知道如何優化我的方法,以便它不會太長並且不會比較兩個相同的字符串嗎?

我認為部分問題是因為我將變量聲明為靜態的,但不確定如何在方法內聲明它們。

碼:

     public class test{

            public static String s1 = "alpha";
            public static String s2 = "delta";
            public static String s3 = "omega";
            public static String s4 = "alpha";
            public static int  result;

            public static void main (String[]args){

                System.out.println(recursiveCompare(s1,s2));  // -1  good
                System.out.println(recursiveCompare(s3,s1));  //  1  good
                System.out.println(recursiveCompare(s4,s1));  //  1  FAIL!!! should be 0
                System.out.println(recursiveCompare(s2,s3));  // -1  good
                System.out.println(recursiveCompare(s1,s1));  // -1  FAIL!!! should be 0

                }

                public static int recursiveCompare(String s1, String S2){
                        if  (s1.length() ==0 || s2.length()==0){
                                if ((s1.length() ==0 && s2.length()==0)){result = 0;}
                                else if ((s1.length() !=0 || s2.length()==0)){result =  1;}
                                else if ((s1.length() ==0 || s2.length()!=0)){result = -1;}
                        }

                        else 
                        {
                            recursiveCompareHelper(s1, s2,0);
                        }
                return result;
                }

            public static int recursiveCompareHelper(String s1,String s2, int index){

                    try{

                        if (s1.regionMatches(true,index,s2,index,1)){
                                result = recursiveCompareHelper(s1,s2,(index+1));}

                            else {
                                    if (s1.charAt(index) > s2.charAt(index)){
                                        result =1;
                                    }

                                    else if (s1.charAt(index) < s2.charAt(index)){
                                        result =-1;
                                    }

                                    else if (s1.charAt(index) == s2.charAt(index)){ 
                                        result = recursiveCompareHelper(s1,s2,(index+1));
                                    }
                                }

                        } catch (StringIndexOutOfBoundsException e){
                                if      (s1.charAt(index)==0 && s2.charAt(index)== 0){result = 0;}
                                else if (s1.charAt(index)==0 && s2.charAt(index)!= 0){result = 1;}
                                else if (s1.charAt(index)!=0 && s2.charAt(index)== 0){result =-1;}
                        }

                        return result;
            }
        }

首先,請注意,您將S2作為參數傳遞給recursiveCompare,而不是s2,因此實際上您將所有內容與“ delta”進行比較,因為s2是靜態變量。 第二,比較字符串時,一旦發現差異,您就可以返回答案,這是錯誤的,只是改變結果的值,因為以后可以再次更改它並返回錯誤的答案。

這是我的解決方案,在每個遞歸調用中,我在前幾個字母之間進行比較,如果它們相等,則以遞歸方式調用該函數,而無需字符串的前幾個字母

public class test {

    public static String s1 = "alpha";
    public static String s2 = "delta";
    public static String s3 = "omega";
    public static String s4 = "alpha";

    public static void main(String[] args) {

        System.out.println(recursiveCompare(s1, s2));  // -1  good
        System.out.println(recursiveCompare(s3, s1));  //  1  good
        System.out.println(recursiveCompare(s4, s1));  //  1  FAIL!!! should be 0
        System.out.println(recursiveCompare(s2, s3));  // -1  good
        System.out.println(recursiveCompare(s1, s1));  // -1  FAIL!!! should be 0

    }

    public static int recursiveCompare(String s1, String s2) {
        if (s1.length() == 0 || s2.length() == 0) {
            if ((s1.length() == 0 && s2.length() == 0)) {
                return 0;
            } else if (s1.length() != 0) {
                return 1;
            } else {
                return -1;
            }
        }
        if (s1.charAt(0) < s2.charAt(0)) {
            return -1;
        } else if (s1.charAt(0) > s2.charAt(0)) {
            return 1;
        } else if (s1.charAt(0) == s2.charAt(0)) {
            return 0;
        } else {
            return recursiveCompare(s1.substring(1), s2.substring(1));
        }
    }

}

輸出:

-1
1
0
-1
0

您不需要使用.langth()方法。 要比較字符串,您需要使用.equals()

public static int recursiveCompare(String s1, String s2){
    if  (s1.equals(s2)) {
        return 0;
    }

    else
    {
        recursiveCompareHelper(s1, s2,0);
    }
    return result;
}

在recursiveCompare(String s1,String S2)中,您擁有S2的s2。

您在程序中犯的主要錯誤是在函數recursiveCompare您已將參數設為S2並在使用變量s2的函數中將其聲明為static變量,因此您的函數無法給出正確的結果。 請記住,java是區分大小寫的語言,在這種情況下, S2s2

以下是我修改后的程序,供您理解。

    public class Test{

 /*    public static String s1 = "alpha";
        public static String s2 = "delta";
        public static String s3 = "omega";
        public static String s4 = "alpha";*/
        public static int  result;


        public static void main (String[]args){

              String s1 = "alpha";
              String s2 = "delta";
              String s3 = "omega";
              String s4 = "alpha";

             System.out.println(recursiveCompare(s1,s2));  // -1  good
             System.out.println(recursiveCompare(s3,s1));  //  1  good
            System.out.println(recursiveCompare(s4,s1));  //  1  FAIL!!! should be 0
            System.out.println(recursiveCompare(s2,s3));  // -1  good
            System.out.println(recursiveCompare(s1,s1));  // -1  FAIL!!! should be 0

            }



            public static int recursiveCompare(String s1, String S2){ 
                    if  (s1.length() ==0 || S2.length()==0){ // here you have to use S2 and not s1
                            if ((s1.length() ==0 && S2.length()==0)){result = 0;}
                            else if ((s1.length() !=0 || S2.length()==0)){result =  1;}
                            else if ((s1.length() ==0 || S2.length()!=0)){result = -1;}
                    }

                    else 
                    {
                        recursiveCompareHelper(s1, S2,0);
                    }
            return result;
            }



        public static int recursiveCompareHelper(String s1,String s2, int index){


                             // System.out.println("String are" + s1+"   "+ s2 + " index is "+ index);

                              if(index<s1.length()) {

                                 // System.out.println("Characters at  index : "+ s1.charAt(index)+ "  "+ s2.charAt(index));

                                if (s1.charAt(index) > s2.charAt(index)){
                                    //System.out.println("In the if condition");
                                    result= 1;
                                }

                                else if (s1.charAt(index) < s2.charAt(index)){
                                    //System.out.println("In the else if condition");
                                    result =-1;
                                }

                                else if (s1.charAt(index) == s2.charAt(index)){
                                    //System.out.println("Character at "+index);
                                    result = recursiveCompareHelper(s1,s2,(index+1));
                                }
                              }
                              else return 0;

                            return result;



        }
    } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM