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



输入:我的名字叫Bob。

输出: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((,或者可能使用模式?

我可以用一些想法。提前感谢您的时间和帮助。

这里有一个在问题的约束条件下工作的解决方案(其中一些是假设的(:

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.

如果您只想在句子末尾保留句点,则可以根据单词是否为第一个单词打印后面跟着空格或句点的单词,也可以通过调用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);

最新更新