java - 使用递归比较两个字符串(不区分大小写)

标签 java string if-statement recursion string-comparison

我需要编写一个递归方法来使用字母顺序比较两个字符串,而不使用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 是一个静态变量。 其次,在比较字符串时,一旦发现差异就可以返回答案,仅仅更改 result 的值是错误的,因为稍后可以再次更改并返回错误的答案。

这是我的解决方案,在每个递归调用中我都会比较第一个字母和 如果它们相等,我会递归调用该函数,而不使用字符串的第一个字母

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

关于java - 使用递归比较两个字符串(不区分大小写),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52575186/

相关文章:

c# - 快速文本阅读(替代 File.ReadAllText() 和/或 StreamReader.ReadToEnd())

C# 3.0 从字符串中删除字符

excel - 扫描列以查找匹配的文本并将结果粘贴到另一列中

java - 在Selenium Webdriver中实例化chrome浏览器的步骤是什么?

java - SparkContext和SparkSession : How to get the "parallelizePairs()"?

java - HTTP 状态 404 - 没有映射与上下文路径 [/struts2] 关联的命名空间 [/] 和操作名称 [login] 的操作

c++ - 在 C++ 中使用外部文件创建数组

java - 正则表达式将字符串转换为 json 数组

java - 列表中的通配符 Java 字符串

c - 如何在不使用 goto 关键字的情况下编写 C 代码?