Java 反转句子但不反转标点符号

Java Reverse a sentence but not punctuation

输入:我叫鲍勃。

输出:Bob 的名字是 My.

我看过很多关于如何颠倒句子中的每个单词和单词序列的例子。但是,我认为我没有看到我想要的例子——上面的例子。这个论坛没有帮助,因为它只关注句子开头和结尾的双引号:

我试过的

public void rev2(String str) {
    String[] arrStr = str.split(" ");
    for (int i = arrStr.length - 1; i >= 0; i--) {
        if (!arrStr[i].contains(".")) {
            System.out.print(arrStr[i] + " ");
        }
    }
}

public static void main(String[] args) {
    Test t = new Test();
    t.rev2("My name is Bob.");
}

上面的代码没有按预期工作。我可能可以将每个字符串转换为 char 并使用 Character.isAlphabet() 或者可以使用 pattern?

我可以使用一些想法。预先感谢您的时间和帮助。

这是一个在问题的限制范围内工作的解决方案(其中一些是假设的):

public void rev2(String str) {
    String[] arrStr = str.split(" ");
    for (int i = arrStr.length - 1; i >= 0; i--) {
        boolean punct = i <= 0 || arrStr[i - 1].contains(".");
        if (!arrStr[i].contains(".")) {
            System.out.print(arrStr[i]);
        } else {
            System.out.print(arrStr[i].substring(0, arrStr[i].length() - 1));
        }
        System.out.print((punct ? ". " : " "));
    }
}

public static void main(String[] args) {
    Tester t = new Tester();
    t.rev2("My name is Bob. I am happy.");
}

解释:

布尔点向前看,看下一个元素是否包含“.”。如果是这样,我们就在一个句子的边界上,所以添加了一个 .在当前单词之后。如果没有,我们就放一个space。我们还添加了一个“。”如果我们在数组的最后一个元素上。

输出: happy am I. Bob is name My.

如果关于标点符号你只想在句末保留句号,你可以打印单词后跟 space 或句号,这取决于它们是第一个单词还是第一个单词不是,您可以通过调用 substring() 从最后一个单词中删除句点。像这样:

public class Test {
    public void rev2(String str) {
        String[] arrStr = str.split(" ");
        for (int i = arrStr.length - 1; i >= 0; i--) {
            if (!arrStr[i].contains(".")) {
                System.out.print(arrStr[i] + (i == 0 ? "." : " "));
            } else {
                System.out.print(arrStr[i].substring(0, arrStr[i].length() - 1) + " ");
            }
        }
    }

    public static void main(String[] args) {
        Test t = new Test();
        t.rev2("My name is Bob.");
    }
}

输出: Bob 的名字是 My.

如果你想要一个不那么冗长的代码:

var list = Arrays.asList("My name is Bob".split(" "));
Collections.reverse(list);
list.stream().map(str -> str.concat(" ")).forEach(System.out::print);