在Java中,如果輸入一串由其他非數字字符隔開的數字,但卻想要將其中的數字提取出來,網上已經給出多種解決方案,以下對這些方法及其對應的情況進行簡單的總結,並提出自己的解決方案:
1.多個由不確定字符隔開的單個數字
該方法只適用於分離字符串中的單個數字字符,因此得到的結果也是個位數的數字。
例如:
1 5、2,5。1 9 2
此時可以考慮將輸入存入String變量,依次讀取字符串中的每個字符,並判斷是否為數字再將其轉化為整型數據。而把單個char類型字符轉化為整型的方法,網上已有非常常見的簡單轉化方法,即將目標數字字符與'0'字符相減,以下做出展示:
import java.util.ArrayList;
import java.util.Scanner;
public class NumberCollector {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String charList = in.nextLine();
ArrayList<Integer> numList = new ArrayList<>();
//遍歷字符串中每個字符,將數字字符轉化為整型數字
for (int i = 0; i < charList.length(); i++) {
if (Character.isDigit(charList.charAt(i))) {
//通過將目標數字字符與'0'字符ASCII碼相減,結果即為該數字本身的整型數字
numList.add(charList.charAt(i) - '0');
}
}
for (int each : numList) {
System.out.println(each);
}
}
}
2.多個由特定字符隔開的任意數字
該方法相比第一種方法,雖然能夠篩選出非個位數的數字,但在操作前,需要明確分割數字的字符。
若輸入的字符串中,數字與數字之間,都是被唯一確定的字符隔開,例如:
5 4 6 12 100 3
1,2,51,12,6
此時可以采用網上給出的一種普遍處理方法,使用split分割字符串再使用Integer中的ParseInt方法將其進行轉換:
import java.util.ArrayList;
import java.util.Scanner;
public class NumberCollector {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String[] numStr = in.nextLine().split(" "); //此處以空格字符分割為例
ArrayList<Integer> numList = new ArrayList<>();
//遍歷分割后的字符串數組並依次轉型為整型
for (int i = 0; i < numStr.length; i++) {
numList.add(Integer.parseInt(numStr[i]));
}
for (int each : numList) {
System.out.println(each);
}
}
}
3.由任意字符隔開的任意數字
由於在開發中,常會遇到奇怪刁鑽的情況,在這里我提出一些個人的想法與應對方案,如題,若遇到此種情況,例如輸入:
5 10,,,103xyz50 a.10
解決思路:若要提取其中的數字轉化為整型數字,可以考慮遍歷字符串中每個字符,若該字符為數字,則往預備區里存入該數字字符,當讀到非數字字符時,即可認為預備區里已經有一個完整的數字字符串,此時再考慮將其轉化為整型數字。
以下給出實現代碼:
import java.util.ArrayList;
import java.util.Scanner;
public class NumberCollector {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String charList = in.nextLine();
in.close();
String integer = ""; //作為數字字符串的預備區
ArrayList<Integer> numList = new ArrayList<>();
for (int i = 0; i < charList.length(); i++) {
//遍歷字符串中每個字符時,若該字符為數字字符,則存入預備區
if (Character.isDigit(charList.charAt(i))) {
integer += charList.charAt(i);
//避免字符串最后一位為數字而遺漏收集的情況
if (i == charList.length() - 1) {
numList.add(Integer.parseInt(integer));
}
}else if (!integer.isEmpty()) { //讀取到非數字字符,並且檢查預備區是否為空
numList.add(Integer.parseInt(integer));
integer = "";
}
}
//輸出收集到的整型數字
for (int each : numList) {
System.out.println(each);
}
}
}
針對上面給出的輸入樣例,可得輸出:
5
10
103
50
10
這種方法同時還可以適用於第一,第二種方法所針對的情況,但如果問題情況非常簡單時,當然還是第一,第二種方法省時省力。
以上是自己根據平時總結的一些網絡上以及個人的方法和技巧,若有疏漏或更好的建議,非常歡迎對此作出評論或提出意見,這樣對我也會有很大的幫助!