java反转句子而不是标点符号

gopyfrb3  于 2021-06-29  发布在  Java
关注(0)|答案(3)|浏览(507)

输入:我叫鲍勃。
输出:鲍勃是我的名字。
我看过很多关于如何颠倒句子中每个单词和单词顺序的例子。然而,我不认为我看到了一个我想要的例子上面。这个论坛没有什么帮助,因为它只关注句子开头和结尾的双引号:如何颠倒字符串中的单词,但保持标点符号在正确的位置?
我试过的

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?
我需要一些想法。提前感谢您的时间和帮助。

pcww981p

pcww981p1#

如果您只想将句点放在句末,则可以根据单词是否为第一个单词,将单词后跟空格或句点打印出来,也可以通过调用将句点从最后一个单词中删除 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.");
    }
}

输出:鲍勃是我的名字。

0mkxixxg

0mkxixxg2#

以下是一个在问题约束范围内工作的解决方案(其中一些是假设的):

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.");
}

说明:
布尔点向前看,看下一个元素是否包含“.”。如果是这样的话,我们就在一个句子的边界上加了一个。在当前单词之后。如果没有,我们就放一个空间。如果我们在数组的最后一个元素上,我们还会添加一个“.”。
输出: happy am I. Bob is name My.

5uzkadbs

5uzkadbs3#

如果希望代码不那么冗长:

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

相关问题