在 Java 中使用字符作为 StringTokenizer 的分隔符
Using characters as a delimiter for StringTokenizer in Java
我正在编写一个程序,该程序接受以逗号分隔的数字列表的输入并对数字的总数求和。例如,我有字符串“10、20、30、40、50”
我想从字符串中分别提取每个数字“10”“20”“30”“40”“50”并求出数字列表的总和。
我找到了一个解决方案,但是,我发现我的代码有点乱,当我回过头来查看它时,我会在一分钟内得到很多 "WTF"。
所以,
我想知道是否有更好的方法来编写以下行:
StringTokenizer inputTokenizer = new StringTokenizer(input, "- ,\n\r\t\b\fabcdefghijklmnopqrstuvwxyz");
我的目标是我希望程序使用每个非数字字符作为 StringTokenizer 的分隔符。
因此,例如字符串 "11abc33"
应该拆分为 "11"
和 "33"
.
这是我想出的源代码
public static void main(String[] args) {
do {
//Prompts user to enter a series of numbers and stores it in the String "input"
String input = JOptionPane.showInputDialog("Enter a series of numbers separated by commas.");
//total stores the sum of each number entered
int total = 0;
if ((input != null)) //checks if the user didn't cancel or quit the program
{
//sets every alphabetical character in the input String to lowercase
input = input.toLowerCase();
//creates a StringTokenizer that uses commas and white spaces as delimiters
StringTokenizer inputTokenizer = new StringTokenizer(input, "- ,\n\r\t\b\fabcdefghijklmnopqrstuvwxyz");
//sums the total of each number entry
while (inputTokenizer.hasMoreTokens()) {
total = total + Integer.parseInt(inputTokenizer.nextToken());
}
} else {
//exit the program because the user hit cancel or exit
System.exit(0);
}
//display the sum of the total number entries
JOptionPane.showMessageDialog(null, "Total: " + total);
} while (true);
}
请注意,stringtokenizer 在正常模式下使用空格分隔数字和子字符串。我的意思是使用这个构造函数 StringTokenizer(string)
但您可以使用另一个构造函数使用 strTokenizer
来分隔数字
StringTokenizer(String str, String delim)
你可以使用","
作为delim参数,所有子串将按照","
分隔,锁定在这个例子:
String numbers = "10,20,30,40,50,60,70";
StringTokenizer t = new StringTokenizer(numbers, ",");
int sum=0;
while (t.hasMoreTokens()) {
sum+=Integer.parseInt(t.nextToken());
}
System.out.println("sum: " + sum);
你也可以简单地使用 String
class
中的 split(String regex)
方法
这里有一个例子和解决方案。
String numbers = "10,20,30,40,50,60,70";// all numbers
String[] separated_numbers = numbers.split(",");// separate them by comma
// calculating sum
int sum = 0;
for (String number : separated_numbers) {
sum += Integer.parseInt(number);
}
// print sum
System.out.println("sum: " + sum);
您可以使用正则表达式
do {
String input = JOptionPane.showInputDialog("Enter a series of numbers separated by commas.");
int total = 0;
if ((input != null))
{
Matcher m = Pattern.compile("(-?[0-9]+.[0-9]*)+").matcher(input);
// when using regex, the first group is always the full text, so we skip it.
for (int i = 1; i<=matcher.groupCount(); i++) {
total = total + Integer.parseInt(matcher.group(i));
}
} else {
System.exit(0);
}
JOptionPane.showMessageDialog(null, "Total: " + total);
} while (true);
没有 StringTokenizer
构造函数或工厂方法可以更简单地完成您想要的操作。如果你必须有一个 StringTokenizer
那么我认为没有更好的方法来获得一个,除非你可以调整分隔符字符串中的字符。
你写了
My goal is that I want the program to use every character that is a non number as a delimiter for StringTokenizer.
但这似乎有点narrow-minded。似乎最重要的是 tokens,而不是 tokenizer,如果确实如此,那么 regex-based String.split()
可能会提供令人满意的选择:
for (String token : input.split("[^0-9]+")) {
int i = Integer.parseInt(token);
// ...
}
这完全符合您的要求,您想要考虑 所有 即 non-number 作为分隔符。
还有其他 regex-based 解决方案,例如使用匹配一个数字的模式通过 Matcher.find()
.
遍历字符串
您可以将所有非数字字符替换为一个字符,然后使用 split
方法得到一个全数字数组。
public static void main(String[] args) {
do {
//Prompts user to enter a series of numbers and stores it in the String "input"
String input = JOptionPane.showInputDialog("Enter a series of numbers separated by commas.");
//total stores the sum of each number entered
int total = 0;
if ((input != null)) //checks if the user didn't cancel or quit the program
{
String[] characterTokens = input.split("[^0-9]+");
for (String characterToken : characterTokens) {
input.replace(characterToken, ",");
}
String[] numberTokens = input.split(",");
for (String numberToken: numberTokens) {
total += Integer.parseInt(numberToken);
}
} else {
//exit the program because the user hit cancel or exit
System.exit(0);
}
//display the sum of the total number entries
JOptionPane.showMessageDialog(null, "Total: " + total);
} while (true);
}
我正在编写一个程序,该程序接受以逗号分隔的数字列表的输入并对数字的总数求和。例如,我有字符串“10、20、30、40、50”
我想从字符串中分别提取每个数字“10”“20”“30”“40”“50”并求出数字列表的总和。
我找到了一个解决方案,但是,我发现我的代码有点乱,当我回过头来查看它时,我会在一分钟内得到很多 "WTF"。
所以,
我想知道是否有更好的方法来编写以下行:
StringTokenizer inputTokenizer = new StringTokenizer(input, "- ,\n\r\t\b\fabcdefghijklmnopqrstuvwxyz");
我的目标是我希望程序使用每个非数字字符作为 StringTokenizer 的分隔符。
因此,例如字符串 "11abc33"
应该拆分为 "11"
和 "33"
.
这是我想出的源代码
public static void main(String[] args) {
do {
//Prompts user to enter a series of numbers and stores it in the String "input"
String input = JOptionPane.showInputDialog("Enter a series of numbers separated by commas.");
//total stores the sum of each number entered
int total = 0;
if ((input != null)) //checks if the user didn't cancel or quit the program
{
//sets every alphabetical character in the input String to lowercase
input = input.toLowerCase();
//creates a StringTokenizer that uses commas and white spaces as delimiters
StringTokenizer inputTokenizer = new StringTokenizer(input, "- ,\n\r\t\b\fabcdefghijklmnopqrstuvwxyz");
//sums the total of each number entry
while (inputTokenizer.hasMoreTokens()) {
total = total + Integer.parseInt(inputTokenizer.nextToken());
}
} else {
//exit the program because the user hit cancel or exit
System.exit(0);
}
//display the sum of the total number entries
JOptionPane.showMessageDialog(null, "Total: " + total);
} while (true);
}
请注意,stringtokenizer 在正常模式下使用空格分隔数字和子字符串。我的意思是使用这个构造函数 StringTokenizer(string)
但您可以使用另一个构造函数使用 strTokenizer
来分隔数字StringTokenizer(String str, String delim)
你可以使用","
作为delim参数,所有子串将按照","
分隔,锁定在这个例子:
String numbers = "10,20,30,40,50,60,70";
StringTokenizer t = new StringTokenizer(numbers, ",");
int sum=0;
while (t.hasMoreTokens()) {
sum+=Integer.parseInt(t.nextToken());
}
System.out.println("sum: " + sum);
你也可以简单地使用 String
class
中的 split(String regex)
方法
这里有一个例子和解决方案。
String numbers = "10,20,30,40,50,60,70";// all numbers
String[] separated_numbers = numbers.split(",");// separate them by comma
// calculating sum
int sum = 0;
for (String number : separated_numbers) {
sum += Integer.parseInt(number);
}
// print sum
System.out.println("sum: " + sum);
您可以使用正则表达式
do {
String input = JOptionPane.showInputDialog("Enter a series of numbers separated by commas.");
int total = 0;
if ((input != null))
{
Matcher m = Pattern.compile("(-?[0-9]+.[0-9]*)+").matcher(input);
// when using regex, the first group is always the full text, so we skip it.
for (int i = 1; i<=matcher.groupCount(); i++) {
total = total + Integer.parseInt(matcher.group(i));
}
} else {
System.exit(0);
}
JOptionPane.showMessageDialog(null, "Total: " + total);
} while (true);
没有 StringTokenizer
构造函数或工厂方法可以更简单地完成您想要的操作。如果你必须有一个 StringTokenizer
那么我认为没有更好的方法来获得一个,除非你可以调整分隔符字符串中的字符。
你写了
My goal is that I want the program to use every character that is a non number as a delimiter for StringTokenizer.
但这似乎有点narrow-minded。似乎最重要的是 tokens,而不是 tokenizer,如果确实如此,那么 regex-based String.split()
可能会提供令人满意的选择:
for (String token : input.split("[^0-9]+")) {
int i = Integer.parseInt(token);
// ...
}
这完全符合您的要求,您想要考虑 所有 即 non-number 作为分隔符。
还有其他 regex-based 解决方案,例如使用匹配一个数字的模式通过 Matcher.find()
.
您可以将所有非数字字符替换为一个字符,然后使用 split
方法得到一个全数字数组。
public static void main(String[] args) {
do {
//Prompts user to enter a series of numbers and stores it in the String "input"
String input = JOptionPane.showInputDialog("Enter a series of numbers separated by commas.");
//total stores the sum of each number entered
int total = 0;
if ((input != null)) //checks if the user didn't cancel or quit the program
{
String[] characterTokens = input.split("[^0-9]+");
for (String characterToken : characterTokens) {
input.replace(characterToken, ",");
}
String[] numberTokens = input.split(",");
for (String numberToken: numberTokens) {
total += Integer.parseInt(numberToken);
}
} else {
//exit the program because the user hit cancel or exit
System.exit(0);
}
//display the sum of the total number entries
JOptionPane.showMessageDialog(null, "Total: " + total);
} while (true);
}