Java CodingBat上2个字符串的substring()逻辑

Java CodingBat上2个字符串的substring()逻辑,java,string,Java,String,我已经研究过好几次了,但是我不知道CodingBat的解决方案代码如何正确地返回两个字符的字符串 这就是他们的解决方案: public String frontBack(String str) { if (str.length() <= 1) return str; String mid = str.substring(1, str.length()-1); // last + mid + first return str.charAt(str.length()-1) +

我已经研究过好几次了,但是我不知道CodingBat的解决方案代码如何正确地返回两个字符的字符串

这就是他们的解决方案:

 public String frontBack(String str) {
 if (str.length() <= 1) return str;
 
 String mid = str.substring(1, str.length()-1);
 
 // last + mid + first
 return str.charAt(str.length()-1) + mid + str.charAt(0);
 }
publicsstringfrontback(stringstr){

如果(str.length()代码交换字符串的第一个和最后一个字符。对于长度为2的字符串,它在mid中不存储任何内容,因为str.substring(1,1)返回空字符串。然后它返回最后一个字符、存储在mid中的空字符串和第一个字符的串联

public class MyClass {
    public static void main(String args[]) {
       String str = "AB";
       if (str.length() <= 1) System.out.println(str);
       String mid = str.substring(1, str.length()-1);
       System.out.println("mid: "+mid);
       System.out.println("last: "+str.charAt(str.length()-1));
       // last + mid + first
      System.out.println(str.charAt(str.length()-1) + mid + str.charAt(0));
    }
}
公共类MyClass{
公共静态void main(字符串参数[]){
字符串str=“AB”;

如果(
substring()
的参数(str.length()包含/排除),那么当索引相同时,
substring()
将返回一个空字符串。对于长度为2的字符串,这意味着中间值为空

下面是以“AB”作为输入的代码演练

public String frontBack(String str) { // str = "AB"
// str.length() = 2, so continue
if (str.length() <= 1) return str;    

// str.length()-1 = 1, so str.substring(1,1) which is empty string.
// mid = "";
String mid = str.substring(1, str.length()-1);

// last + mid + first

// str.charAt(str.length()-1) = "B"
// str.charAt(0) = "A"
// "B" + "" + "A" = "BA"
return str.charAt(str.length()-1) + mid + str.charAt(0);

// returns "BA"
}
publicstringfrontback(stringstr){//str=“AB”
//str.length()=2,继续吗

if(str.length()如果您认为索引之间的字母是,那么使用
substring
方法更容易,如下所示为“AB”

子字符串(a,b)
将返回位于索引
a
b
之间的字符

因此,当我们执行如下代码时:

  • 子字符串(0,2)
我们得到完整的
“AB”
  • “AB”。子字符串(0,1)
    我们得到
    “A”
  • 当我们执行如下代码时,让您感到困惑的是:
    “AB”。子字符串(1,1)
    (0,0)
    (2,2)

    当我们对开始索引和结束索引使用相同的值时,子字符串的结果将是空字符串
    ,因为这些索引之间没有字符

    让我们回到你的例子。 当我们执行

    String mid = str.substring(1, str.length()-1);
    
    然后,它与执行
    子字符串(1,2-1)
    =>
    子字符串(1,1)
    相同,这意味着
    mid
    将保存空字符串
    “”

    现在当我们打电话的时候

    return str.charAt(str.length()-1) + mid + str.charAt(0);
    
    它将被评估为

    return 'B' + "" + 'A';
    
    这意味着我们最终会

    return "BA";
    

    我建议安装Eclipse或其他IDE并在调试中运行该示例。这是学习JAVA的最佳方法之一。从您的示例中,我可以告诉您以下几点: Mid将为null,因为正在从位置1到1生成子字符串=>长度=0

    对于str=“AB” 调试捕获:

    如果子字符串是从1到2,那么它将显示字母B:

    因此,您将只看到str.charAt(str.length()-1)+str.charAt(0)的结果 这是B和A。

    公共静态字符串前向(字符串str){
    
    public static String frontBack(String str) {
        if (str.length() < 2)
            return str;
    
        char first = str.charAt(0);
        char last = str.charAt(str.length() - 1);
    
        if (str.length() == 2)
            return Character.toString(last) + first;
        return last + str.substring(1, str.length() - 1) + first;
    }
    
    如果(str.length()<2) 返回str; char first=str.charAt(0); char last=str.charAt(str.length()-1); 如果(str.length()==2) 返回字符.toString(last)+first; 返回last+str.substring(1,str.length()-1)+first; }
    您期望得到什么?我建议添加
    System.out.println()
    语句,看看这里发生了什么。将return语句的各个部分分配给单独的变量将有助于您了解每个部分是什么。mid=substring(1,1)=>substring(1,0)。因为0小于1,所以它不会返回任何内容
    public static String frontBack(String str) {
        if (str.length() < 2)
            return str;
    
        char first = str.charAt(0);
        char last = str.charAt(str.length() - 1);
    
        if (str.length() == 2)
            return Character.toString(last) + first;
        return last + str.substring(1, str.length() - 1) + first;
    }