Java 比较字符串数组并返回最小的字符串

Java 比较字符串数组并返回最小的字符串,java,arrays,string,recursion,compareto,Java,Arrays,String,Recursion,Compareto,我正在实现一个代码来比较字符串的数组,并使用stringONE.compareTo(stringTwo)返回最小的一个 代码将使用递归在数组中交替,而不是使用for循环 我实现了这个代码,这样compare方法就可以使用不同的参数不断地调用自己,直到到达数组的末尾,然后异常处理将退出递归 问题在于:它会不断迭代,直到达到堆栈溢出,而不会触发outofboundsException 下面是我的代码,您可以进行测试: 代码: 公共类递归findminium{ 公共静态字符串[]stringArr

我正在实现一个代码来比较
字符串的
数组
,并使用
stringONE.compareTo(stringTwo)
返回最小的一个

代码将使用递归在
数组
中交替,而不是使用for循环

  • 我实现了这个代码,这样compare方法就可以使用不同的参数不断地调用自己,直到到达
    数组的末尾,然后异常处理将退出递归

    问题在于:它会不断迭代,直到达到堆栈溢出,而不会触发
    outofboundsException

下面是我的代码,您可以进行测试:

代码:

公共类递归findminium{
公共静态字符串[]stringArray={“delta”、“alpha”、“omega”、“zeta”};
公共静态字符串结果;
公共静态void main(字符串[]args){
System.out.println(“结果:+findminium(stringArray,0,1));
}
公共静态字符串findminium(字符串[]stringArray,int index1,int index2){
int number=stringArray[index1]。比较(stringArray[index2]);
如果(数字<0){
findminium(stringArray,index1,index2++);zebobi=“delta1”;
}
否则,如果(数字>0){
findminium(stringArray,index2,index2++);zebobi=“delta2”;
}
else if(数字==0){
findminium(stringArray,index1,index2++);zebobi=“delta3”;
}
}捕获(例外e){
系统输出打印项次(index1);
系统输出打印项次(index2);
结果=字符串数组[index1]
返回结果;
}
}

在递归中,必须始终有一个基本情况,即停止递归的点。目前,对于每个可能的结果,您都有递归案例:

if (number< 0){
     findMinimum(stringArray,index1,index2++); zebobi="delta1";
}
else if (number> 0){
     findMinimum(stringArray,index2,index2++);zebobi="delta2";
}
else if (number== 0){
     findMinimum(stringArray,index1,index2++);zebobi="delta3";
}

如果尝试触发异常,然后从异常块返回:

-您需要添加一个
try
块(如果不尝试,您将无法获得捕获)

-您需要通过
index2+1
而不是
index2++

-您需要返回
stringArray[index2]
而不是
stringArray[index1]

public static String findMinimum(String[] stringArray, int index1, int index2) 
{
    String result;
    int number = stringArray[index1].compareTo(stringArray[index2]);

    try {
        if (number< 0){
        result = findMinimum(stringArray,index1,index2+1); zebobi="delta1";}

        else if (number> 0){
        result = findMinimum(stringArray,index2,index2+1);zebobi="delta2";}

        else if (number== 0){
        result = findMinimum(stringArray,index1,index2+1);zebobi="delta3";}

    }catch(Exception e){
        System.out.println(index1);
        System.out.println(index2);
        result= stringArray[index2]; 
    }
    return result;
}

下面是另一种可能的解决方案,可以避免索引出现这些问题:

公共静态字符串findMinimumRecursive(字符串[]数组,字符串currentMinString){
如果(array.length==0)
返回当前字符串;
返回findMinimumRecursive(
数组.copyOfRange(数组,1,数组.length),
((整数)currentMinString.length()).compareTo(数组[0].length())<0?currentMinString:array[0]);
}
然后您可以像这样调用此函数:

String[] arr = {"abc", "abcd", "ab", "abe"};
String result = findMinimumRecursive(Arrays.copyOfRange(arr, 1, arr.length), arr[0]);
此函数将使用数组的第一个元素计算当前最小长度字符串,并且每次它都将使用相同的数组调用自己,该数组中已删除计算的元素和当前最小字符串。 停止条件是输入数组为空,它只返回与数组中所有字符串的最小长度相对应的当前最小长度字符串

然后,调用将如下所示:

  • 递归查找([“abcd”、“ab”、“abe”]、“abc”)
  • 递归查找([“ab”、“abe”]、“abc”)
  • 递归地查找([“abe”],“ab”)
  • 递归地查找([“abe”],“a”)
  • 递归地查找([],“a”)

  • 请注意,方法Arrays.copyOfRange使用与第一个参数相同的元素创建数组,但仅从第二个和第三个参数的开始和结束索引创建数组-请参见

    欢迎使用SO!这将无法编译:您缺少一个分号,如果没有
    try
    ,则无法
    catch
    。我还建议将全局变量放在
    main
    范围内。我现在更明白了。我以为超自然的感觉会阻止这种改变。但是,当异常处理完成时,它会返回到原来的位置。我想知道我应该使用什么作为基本情况,您仍然需要声明结果(或者直接返回任何地方)。此外,catch块中的返回似乎是redundant@StefanHausteinOP已将
    结果
    声明为
    静态
    变量。感谢您对多余退货声明的建议。我把它移走了。。。对于静态结果,您不需要if分支中的赋值。。。O:)若结果是静态的,这意味着只有一个值可以在任何地方共享。因此,一旦在递归函数中赋值,它就可以在函数外部访问,并且不需要返回。通常情况下,人们希望函数尽可能地隔离——如果可行,只对输入进行操作并返回结果(而不是写入全局状态),因为这确保了函数可以在其他上下文中轻松重用,并且关于函数的推理可以限制在函数中
    public static String findMinimum(String[] stringArray, int index1, int index2) 
    {
        String result;
        int number = stringArray[index1].compareTo(stringArray[index2]);
    
        try {
            if (number< 0){
            result = findMinimum(stringArray,index1,index2+1); zebobi="delta1";}
    
            else if (number> 0){
            result = findMinimum(stringArray,index2,index2+1);zebobi="delta2";}
    
            else if (number== 0){
            result = findMinimum(stringArray,index1,index2+1);zebobi="delta3";}
    
        }catch(Exception e){
            System.out.println(index1);
            System.out.println(index2);
            result= stringArray[index2]; 
        }
        return result;
    }
    
    result :  zeta
    
    String[] arr = {"abc", "abcd", "ab", "abe"};
    String result = findMinimumRecursive(Arrays.copyOfRange(arr, 1, arr.length), arr[0]);