java 交换最后一个和第一个字符串 - 问题适用于 3 但不适用于 4

java swap last and 1st strings - problem works for 3 but not for 4

下面的代码在数组中的字符串数为奇数 (3,5,7) 时有效,但在数字为偶数时无效。例如,如果我使用“我的名字”,我会得到输出

name is the name

public void randomTest() {
       String str ="my is name";
       //Step1: split so that I can get them in in array
       String [] arrStr= str.split(" ");
       for(int i=0;i<arrStr.length;i++){
           //Step2: Using temp swap 1st and last 
           String temp = arrStr[0];
           arrStr[0] = arrStr[arrStr.length-1];
           arrStr[arrStr.length-1] = temp;

           System.out.print(arrStr[i]+" ");
       }
    }

知道如何让它适用于偶数个字符串吗?谢谢。

您只需对数组长度的一半进行循环迭代,即

for (int i = 0; i < arrStr.length / 2; i++)

此外,您需要使用计数器变量 i 而不是固定值 01。确保将索引限制在 0 to length_of_array - 1 范围内,这是 Java.

中数组的索引范围

按如下操作:

public class Main {
    public static void main(String[] args) {
        String str = "my is the name";
        String[] arrStr = str.split(" ");

        // Swap the elements of the array
        for (int i = 0; i < arrStr.length / 2; i++) {
            String temp = arrStr[i];
            arrStr[i] = arrStr[arrStr.length - i - 1];
            arrStr[arrStr.length - i - 1] = temp;
        }

        // Display the array
        for (int i = 0; i < arrStr.length; i++) {
            System.out.print(arrStr[i] + " ");
        }
    }
}

输出:

name the is my 

如果只想交换第一个词和最后一个词,则不需要循环。你可以简单地这样:

public class Main {
    public static void main(String[] args) {
        String str = "my is the name";
        String[] arrStr = str.split(" ");

        // Swap the first and the last words
        String temp = arrStr[0];
        arrStr[0] = arrStr[arrStr.length - 1];
        arrStr[arrStr.length - 1] = temp;

        // Display the array
        for (int i = 0; i < arrStr.length; i++) {
            System.out.print(arrStr[i] + " ");
        }
    }
}

输出:

name is the my 

由于Arvind Kumar Avinash分享了固定的解决方案,我只是想提供一个替代方案:将字符串拆分为String数组后,也许你可以简单地交换最后一个和第一个值,然后将它们连接在一起:

String str ="my is the name";

// split
String[] arrStr= str.split(" ");

// swap
String temp = arrStr[0];
arrStr[0] = arrStr[arrStr.length - 1];
arrStr[arrStr.length - 1] = temp;

// join them back
str = String.join(" ", arrStr);

System.out.println(str); // name is the my

您当前正在做的是交换第一个和最后一个元素 n 次,其中 n 是数组的大小。这使得当你有偶数个元素时,例如,2,然后你交换第一个和最后一个元素,然后将它们交换回它们的原始位置,这是未交换的。这也是为什么它适用于奇数个元素的原因,因为您将第一个和最后一个元素交换偶数次然后再交换一次。如果你只想交换第一个和最后一个元素,你可以简单地去掉你的 for 循环,它会正常工作。

    public void randomTest() {
       String str ="my is name";
       //Step1: split so that I can get them in in array
       String [] arrStr= str.split(" ");
       
       //Step2: Using temp swap 1st and last 
       String temp = arrStr[0];
       arrStr[0] = arrStr[arrStr.length-1];
       arrStr[arrStr.length-1] = temp;
    }

之后,如果要将字符串重新合并在一起,可以使用

str = String.join(" ", arrStr);

或像这样的 StringBuilder 对象。

StringBuilder sb = new StringBuilder(arrStr[0]);
for (int i = 0; i < arrStr.length; i++) {
    sb.append(" ").append(arrStr[i]);
}
str = sb.toString();

其中任何一个的效果都会将 my name is foo 变成 foo name is my,基本上是交换第一个和最后一个单词,并且适用于任何长度或单词数量的字符串。

最简单的方法是从句子中提取第一个和最后一个词。

    int first = name.indexOf(' ');                             // first "space" character that occurs
    int last = name.lastIndexOf(' ');                          // last "space" character that occurs

    String firstWord = name.substring(0, first);               // substring first word from index 0  to index of first "space" character
    String lastWord = name.substring(last, name.length()-1);   // substring last word from index the of last "space" character to higher index o sentence
    String midSentece = name.substring(first, last);           // substring rest of the sentence

    System.out.println(lastWord + midSentece + firstWord);