Java實現Python式字串切片

banq發表於2025-03-02

在本文中,我們看到,儘管 Java 缺乏 Python 簡潔的字串切片語法,但我們可以使用substring()、迴圈和StringBuilder實現類似的功能。透過利用這些技術,Java 開發人員可以以與 Python 強大的切片功能非常相似的方式有效地操作字串。此外, Apache Commons Lang等第三方庫提供了可以進一步簡化字串操作的實用程式。

字串操作是程式設計中的常見任務。Python 提供了一種使用簡單語法對字串進行切片的直接方法。但是,Java 中的字串切片並不那麼直接,需要不同的方法才能實現相同的功能。

在本教程中,我們將探討 Java 與 Python 字串切片的等效之處以及如何有效地實現類似的操作。

理解 Python 的字串切片
在 Python 中,對字串進行切片非常簡單,只需使用冒號(:)運算子即可。語法遵循以下模式:

字串[start:stop:step]

  • start:起始索引(含)
  • stop:結束索引(不包括)
  • step:增量(預設為 1)
  • 負索引:從字串末尾開始計數

讓我們看幾個對字串“Hello World!”進行切片的例子:

s = <font>"Hello, World!"
s[0:5]  # Output: Hello
s[:5]   # Output: Hello
s[7:]   # Output: World!
s[-6:]  # Output: World!
s[::2]  # Output: Hlo ol!
s[::-1] # Output: !dlroW ,olleH

現在,讓我們探討如何在 Java 中實現類似的行為。

Java 中的基本字串切片
與 Python 不同,Java 沒有內建切片符號。但是,我們可以使用substring()方法來實現類似的結果。

提取子字串
在 Python 中提取子字串是一項簡單的任務,這個概念在 Java 中也類似。

讓我們看看如何在 Python 中提取子字串:

s = <font>"Hello, World!"
sub = s[0:5] #
"Hello"

接下來我們用 Java 檢查一下提取過程:

String s = <font>"Hello, World!";
String sub = s.substring(0, 5);
// "Hello"<i>

在 Java 中,substring(start, end)提取從 start(包含)到 end(不包含)的部分,就像 Python 的切片一樣。

省略開始或結束索引
就像提取子字串一樣,也有一種方法可以從開頭或結尾省略部分字串。

要在 Python 中省略,我們只需提供要省略的索引:

s[:5] # <font>"Hello"
s[7:] #
"World!"

我們可以在 Java 中使用相同的substring()方法:

assertEquals(<font>"Hello", s.substring(0, 5));
assertEquals(
"World!", s.substring(7));

當僅提供起始索引時,Java 的substring(start)會從起始處提取到字串的末尾,模仿 Python 的行為。

Java 中的負索引
Python 允許負索引從末尾開始計數:

s[-6:]  # <font>"World!"

但是,Java 不支援負索引,所以我們必須手動轉換它們:

assertEquals(<font>"World!", s.substring(s.length() - 6));

這裡,s.length() – 6計算正確的起始索引。

在 Java 中實現步驟切片
在 Python 中,切片概念允許一步步跳過字元:

s[::2]  # <font>"Hlo ol!"

由於 Java 沒有提供內建方法來實現這一點,我們可以使用StringBuilder來實現這個結果:

StringBuilder result = new StringBuilder();
for (int i = 0; i < s.length(); i += 2) {
    result.append(s.charAt(i));
}
assertEquals(<font>"Hlo ol!", result.toString());

我們可以使用一個簡單的迴圈來對 Java 中的任何字串執行分步切片。

反轉字串
在 Python 中,我們可以有效地使用[::-1]來反轉字串:

s[::-1]  # <font>"!dlroW ,olleH"

在 Java 中,我們可以再次使用StringBuilder:

String reversed = new StringBuilder(s).reverse().toString();
assertEquals(<font>"!dlroW ,olleH", reversed);

或者,我們可以使用迴圈:

String reversed = <font>"";
for (int i = s.length() - 1; i >= 0; i--) {
    reversed += s.charAt(i);
}
assertEquals(
"!dlroW ,olleH", reversed);

但是,StringBuilder效率更高,因為迴圈內的字串連線會建立多個不可變的字串物件,從而導致效能開銷。

使用 Start/Stop 實現負步進
Python 允許使用負步長進行切片,即在指定範圍內以相反的順序提取元素。這對於反向選擇字元或在向後移動時跳過元素很有用。

Python:

s[-7:-1:2]  # <font>" ol"

Java 沒有內建對負步長切片的支援,因此我們將按照所需的順序手動進行迭代:

StringBuilder result = new StringBuilder();
for (int i = s.length() - 7; i < s.length() - 1; i += 2) {
    result.append(s.charAt(i));
}
assertEquals(<font>" ol", result.toString());

我們使用迴圈來提取字元,同時正確處理索引。
 

相關文章