簡體   English   中英

Java 反句不標點

[英]Java Reverse a sentence but not punctuation

輸入:我的名字是鮑勃。

Output:鮑勃是我的名字。

我已經看到很多關於如何在一個句子中反轉每個單詞然后單詞序列的例子。 但是,我認為我沒有看到我想要的例子——上面的例子。 這個論壇沒有幫助,因為它只關注句子開頭和結尾的雙引號: 如何反轉字符串中的單詞但將標點符號保留在正確的位置?

我試過的

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

解釋:

boolean punct 向前看,看下一個元素是否包含“.”。 如果是這樣,我們就在一個句子的邊界上,所以添加了一個。 在當前單詞之后。 如果沒有,我們就放一個空格。 我們還添加了一個“。” 如果我們在數組的最后一個元素上。

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

Output:鮑勃是我的名字。

如果你想要一個不那么冗長的代碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM