输入:我的名字叫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);