如何在 Java 中將整數拆分為數字
1. 概述
當我們在 Java 中處理整數時,有時我們需要將它們分解為單獨的數字以進行各種計算或數據操作任務。
在本教程中,我們將探索使用 Java 將整數拆分為其組成數字的各種方法。
2.問題介紹
像往常一樣,讓我們通過一個例子來理解這個問題。假設我們有一個整數:
int THE_NUMBER = 1230456;
我們的目標是將數字按順序分解為數字:
1, 2, 3, 0, 4, 5, 6
為簡單起見,本教程將主要關注正十進制整數。但是,根據具體需求,我們可能希望將每個數字獲取為Integer
、 char
或String.
接下來,讓我們探索適應這些不同返回類型的各種方法。
3. 拆分為Integer
列表
首先,讓我們將給定的整數分解為Integer
列表。也就是說,我們的目標是得到這個列表:
List<Integer> EXPECTED_INT_LIST = Lists.newArrayList(1, 2, 3, 0, 4, 5, 6);
最直接的方法之一是使用循環重複將數字除以 10,在每次迭代中提取提醒,直到數字變為零:
1230456 / 10 = 123045 Reminder: 6
|-> 123045 / 10 = 12304 Reminder: 5
|-> 12304 / 10 = 1230 Reminder: 4
|-> 1230 / 10 = 123 Reminder: 0
|-> 123 / 10 = 12 Reminder: 3
|-> 12 / 10 = 1 Reminder: 2
|-> 1 / 10 = 0 Reminder: 1
然而,如上面的示例所示,這種方法會以相反的順序生成數字。為了解決這個問題,我們可以使用LinkedList
作為堆棧,並在每一步中將提醒push()
送到堆棧:
int number = THE_NUMBER;
LinkedList<Integer> result = new LinkedList<>();
while (number > 0) {
result.push(number % 10);
number /= 10;
}
assertEquals(EXPECTED_INT_LIST, result);
此外,我們可以使用遞歸來實現相同的想法:
void collectDigits(int num, List<Integer> digitList) {
if (num / 10 > 0) {
collectDigits(num / 10, digitList);
}
digitList.add(num % 10);
}
然後,我們可以調用collectDigits()
方法來獲取結果:
List<Integer> result = new ArrayList<>();
collectDigits(THE_NUMBER, result);
assertEquals(EXPECTED_INT_LIST, result);
如果我們的Java版本是Java 9或更高版本,我們可以使用String.chars()
和IntStream
來獲取數字列表:
String numStr = String.valueOf(THE_NUMBER);
List<Integer> result = numStr.chars().map(Character::getNumericValue).boxed().collect(Collectors.toList());
assertEquals(EXPECTED_INT_LIST, result);
如上面的代碼所示,我們首先將整數轉換為字符串。然後, numStr.chars()
方法將數字字符串分解為字符作為IntStream
。接下來, Character
的**getNumericValue()
從IntStream
中的 char 中獲取int
形式的數字。**最後,我們將int
裝箱為Integer
並將結果收集到列表中。
4. 拆分為char
數組
有時,我們想將給定的整數拆分為char[]
數組:
char[] EXPECTED_CHAR_ARRAY = new char[] { '1', '2', '3', '0', '4', '5', '6' };
此任務很簡單,因為標準String
類提供toCharArray()
將字符串分解為char[]
。我們需要做的只是將整數轉換為String
並調用toCharArray()
方法:
String numStr = String.valueOf(THE_NUMBER);
char[] result = numStr.toCharArray();
assertArrayEquals(EXPECTED_CHAR_ARRAY, result);
當然,如果需要,我們可以快速將數組轉換為列表。
5. 拆分為String
數組或String
列表
最後,讓我們看看如何將整數拆分為String[]
數組或String
列表:
String[] EXPECTED_STR_ARRAY = new String[] { "1", "2", "3", "0", "4", "5", "6" };
List<String> EXPECTED_STR_LIST = Lists.newArrayList("1", "2", "3", "0", "4", "5", "6");
由於我們將此操作稱為“split”,因此強大的split()
方法可以幫助我們解決問題:
String numStr = String.valueOf(THE_NUMBER);
String[] result = numStr.split("(?<=.)");
assertArrayEquals(EXPECTED_STR_ARRAY, result);
正如我們所看到的,代碼看起來非常緊湊。關鍵是我們在split()
函數中使用的正則表達式模式。 (?<=.)
是一個正向回顧表達式。例如, “(?<=X)a”
匹配“ X
”字符後面的每個“ a
”。
然而,我們的模式中只有(?<=.)
。這使得模式匹配為零寬度。因此, split
() 將任意字符**後面的零寬度“字符”**作為分割符。如果我們用“#”字符來代替數字字符串中的零寬度“字符“1#2#3#0#4#5#6#”.
此外, split()
默認情況下會丟棄尾隨的空元素。因此,它產生了期望的結果。
六,結論
在本文中,我們探索了將整數分解為數字的多種方法。此外,我們還通過示例了解瞭如何獲取不同類型的數字,例如Integer
、 char,
和String,
。
與往常一樣,示例的完整源代碼可在 GitHub 上獲取。