Сравните две строки, используя рекурсию (без учета регистра) - PullRequest
0 голосов
/ 30 сентября 2018

Мне нужно было написать рекурсивный метод для сравнения двух строк в алфавитном порядке без использования 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.

Любая идея, как я могу оптимизировать мой метод, чтобы он не был слишком длинным и не мог не сравнить две одинаковые строки?

Я думаю,Частично моя проблема заключается в том, что я объявил свою переменную static, но не уверен, как мне ее обработать, чтобы объявить их внутри метода.

Код:

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

Ответы [ 3 ]

0 голосов
/ 30 сентября 2018

Прежде всего, обратите внимание, что вы передаете S2 в качестве параметра recursiveCompare, а не s2, так что на самом деле вы сравниваете все с "delta", потому что s2 является статической переменной.во-вторых, при сравнении строк, как только вы обнаружите разницу, вы можете вернуть ответ, неправильно менять значение результата, потому что его можно изменить позже и вернуть неправильный ответ.

thisмое решение, внутри каждого рекурсивного вызова я сравниваю первые буквы и, если они равны, я вызываю функцию рекурсивно без первых букв строк

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

}

output:

-1
1
0
-1
0
0 голосов
/ 30 сентября 2018

Основная ошибка, которую вы допустили в своей программе, заключается в функции recursiveCompare, в которой вы приняли аргумент как S2 и в функции, использующей переменную s2, которая объявлена ​​как переменная static, поэтому ваша функция не может выдатьправильный результат.Помните, что java - это регистрозависимый язык, и в этом случае S2 - это не то же самое, что 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 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;



        }
    } 
0 голосов
/ 30 сентября 2018

Вам не нужно использовать метод .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.

...