Java 方法转换为字符串中最低的字母(按字母顺序)

Java 方法转换为字符串中最低的字母(按字母顺序),java,string,if-statement,recursion,methods,Java,String,If Statement,Recursion,Methods,我正在尝试编写一个简单的方法,它接受一个字符串并返回该字符串中最小的字母。例如,给定字符串“basic”,应返回“a” 这是我想出的代码。目前我遇到了一个OutOfMemory错误。您还将注意到,我试图使用递归,但我也愿意接受不使用递归的建议 public static String smallestLetter(String str) { if (str.length() == 1) return str.substring(0); el

我正在尝试编写一个简单的方法,它接受一个字符串并返回该字符串中最小的字母。例如,给定字符串“basic”,应返回“a”

这是我想出的代码。目前我遇到了一个OutOfMemory错误。您还将注意到,我试图使用递归,但我也愿意接受不使用递归的建议

public static String smallestLetter(String str) {
        if (str.length() == 1)
            return str.substring(0);
        else if (str.charAt(0) < str.charAt(1))
            return smallestLetter(str.substring(0) + str.substring(2,str.length()));
        else
            return smallestLetter(str.substring(1,str.length()));
}
公共静态字符串smallestLetter(字符串str){
如果(str.length()==1)
返回str.substring(0);
else如果(str.charAt(0)

请告诉我哪里出了问题,以及我能做些什么来解决它。谢谢

我认为您的代码过于深入递归,在某个时刻堆内存已经用完

如果我们假设您只需要查找拉丁字母,我会这样做:

public static String smallestLetter(String str) {
    for (Character ch = 'a'; ch <= 'z'; ++ch) {
        if (str.contains(String.valueOf(ch))) {
            return String.valueOf(ch);
        }
    }
    return "No characters in the string :(";
}    
公共静态字符串smallestLetter(字符串str){

对于(Character ch='a';ch我认为您的代码过于深入递归,有时堆内存已经用完

如果我们假设您只需要查找拉丁字母,我会这样做:

public static String smallestLetter(String str) {
    for (Character ch = 'a'; ch <= 'z'; ++ch) {
        if (str.contains(String.valueOf(ch))) {
            return String.valueOf(ch);
        }
    }
    return "No characters in the string :(";
}    
公共静态字符串smallestLetter(字符串str){

对于(字符ch='a';ch而言,问题在于这一行:

        return smallestLetter(str.substring(0) + str.substring(2,str.length()));
str.substring(0)
实际上是整个字符串;因此,在这一行中,该方法使用一个几乎是原始字符串两倍大的字符串重新调用自己。只需调用几个方法,您就可以拥有一个大于您可以分配的大字符串

最基本的解决方案是:

        return smallestLetter(str.charAt(0) + str.substring(2,str.length()));
但更好的解决方法是使用迭代而不是递归:

public static String smallestLetter(String str) {
    char ret = str.charAt(0);
    for (int i = 1; i < str.length(); ++i)
        if (str.charAt(i) < ret)
            ret = str.charAt(i);
    return String.valueOf(ret);
}
公共静态字符串smallestLetter(字符串str){
char-ret=str.charAt(0);
对于(int i=1;i

编辑以添加:请注意,如下所述,如果
str
是空字符串(
),则会引发异常。此外,它不会进行任何筛选来专门识别字母;相反,它将返回字符串中最小的字符,无论该字符是否为字母。

问题在于这一行:

        return smallestLetter(str.substring(0) + str.substring(2,str.length()));
str.substring(0)
实际上是整个字符串;因此,在这一行中,该方法使用一个几乎是原始字符串两倍大的字符串重新调用自己。只需调用几个方法,您就可以拥有一个大于您可以分配的大字符串

最基本的解决方案是:

        return smallestLetter(str.charAt(0) + str.substring(2,str.length()));
但更好的解决方法是使用迭代而不是递归:

public static String smallestLetter(String str) {
    char ret = str.charAt(0);
    for (int i = 1; i < str.length(); ++i)
        if (str.charAt(i) < ret)
            ret = str.charAt(i);
    return String.valueOf(ret);
}
公共静态字符串smallestLetter(字符串str){
char-ret=str.charAt(0);
对于(int i=1;i
编辑以添加:请注意,如下所述,如果
str
是空字符串(
“”
),则会引发异常。此外,它不会进行任何筛选以专门识别字母;相反,它将返回字符串中最小的字符,无论该字符是否为字母。

尝试以下操作:

char min = s.charAt(0);
for (int i = 0; i < s.length(); i++)
    if (Character.isLetter(s.charAt(i)) && s.charAt(i) < min)
        min = s.charAt(i);
return min;
charmin=s.charAt(0);
对于(int i=0;i
试试这个:

char min = s.charAt(0);
for (int i = 0; i < s.length(); i++)
    if (Character.isLetter(s.charAt(i)) && s.charAt(i) < min)
        min = s.charAt(i);
return min;
charmin=s.charAt(0);
对于(int i=0;i
为什么要使用递归?只需迭代并保留对min的引用。您需要读取子字符串的javadoc。
子字符串(0)
不符合您的想法。为什么要使用递归?只需迭代并保留对min的引用。您需要读取子字符串的javadoc。
子字符串(0)
没有你想的那样。如果(str.charAt(i)
?@GoldRoger:应该是,现在是。谢谢!:-)代码返回第一个字母,这可能导致零长度字符串出现边界外。另一个问题-字符串可能不包含字母,在这种情况下,您将返回第一个字符,这可能不是所需的结果。@AlexeyMalev:Re:first problem:correct。此方法将为零长度字符串引发异常。OP的c也是如此Re:第二个问题:这段代码没有尝试按实际的“字母”进行过滤,因为OP的代码没有,我不确定它是否真的应该这样做。(OP可能是指“字符”,或者可能根本不关心包含非字母的字符串的行为。)@ruakh你的陈述很有道理,我写这篇文章只是为了了解这些。如果(str.charAt(I)
?@GoldRoger:应该是,现在是。谢谢!:-)代码返回第一个字母,这可能导致零长度字符串出现边界外。另一个问题-字符串可能不包含字母,在这种情况下,您将返回第一个字符,这可能不是所需的结果。@AlexeyMalev:Re:first problem:correct。此方法将为零长度字符串引发异常。OP的c也是如此Re:第二个问题:这段代码没有尝试按实际的“字母”进行过滤,因为OP的代码没有,我不确定它是否真的应该这样做。(OP可能是指“字符”,或者可能根本不关心包含非字母的字符串的行为。)@ruakh你的陈述很有道理,我写这篇文章只是为了了解这些。