在保持顺序和空格数的同时反向打印单词?

Reverse printing words while maintaining order and number of spaces?

我正在尝试解决 this problem 但我不确定为什么我的解决方案不起作用。我的调试尝试告诉我,该解决方案正在尝试访问某些数据结构边界之外的索引,但这对我来说没有意义,因为我的 for 循环测试似乎会这样做。

除此之外,此解决方案可能还有许多其他问题。

我也 90% 确定有一种更有效的方法可以做到这一点。你能帮我看看我哪里做错了吗?

如果有更高效的解决方案,会是什么?我正在努力以有效的方式以相同的顺序跟踪相同数量的空格。

如果需要更多信息,请告诉我,我会更新。

public static void printReversed(String line){
    Scanner console = new Scanner(line);
    ArrayList<String> list = new ArrayList<String>(); // keeps track of words in line
    int spaceOccur = 0; // keeps track of the number of times there are spaces
    while (console.hasNext()){
        list.add(console.next()); 
        spaceOccur++;
    }
    int[] spaces = new int[spaceOccur]; // keeps track of number of spaces for each occurrence of spaces
    int count = 0; // for spaces[] traversal

    // searches through original input to get number of spaces
    for (int i = 0; i < line.length() - 1; i++){ 
        if (line.charAt(i) ==  ' '){
            int j = i;
            int num = 0;
            // traversal through spaces to count how many
            while (line.charAt(j) == (' ')){ // first error here
                num++;
                j++;
            }
            i = j; // updates for loop counter to point past spaces
            spaces[count] = num; // saves number of spaces
            count++; 
        }
    }
    // printing reversed input
    for (int k = 0; k < list.size(); k++){ 
        // prints reversed chars
        for (int m = list.get(k).length(); m > 0; m++){
            System.out.print(list.get(k).charAt(m)); 
        }
        // prints spaces
        for (int n = 0; n < spaces[k]; n++){
            System.out.print(" ");
        }
    }
}

我会说你走对了路,但有些地方需要仔细检查。第一个循环似乎有一些问题:j++ 可能超出了数组的边界——至少如果你的字符串末尾有 spaces。整个循环本身似乎忽略了该行的最后一个字符。

你确定你需要第一个循环吗?如果我没理解错的话,Scannernext() 会给你 space 之间的字符串;在连续两个 space 的情况下,我认为它应该 return 你一个空字符串。在这种情况下,您可以按照函数末尾的方式循环列表,并在列表中遇到空字符串时打印 space 字符。否则只需向后打印单词,就像你已经做的一样(除了它应该是 m-- 而不是最后一个 for 循环中的 m++)。

但是如果 Scanner 在有两个或多个连续的 space 字符时不会给你空字符串,我敢打赌字符串的 split() 方法应该有效。