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);
输入:我叫鲍勃。
输出: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);