我正在尝试将所有数字字零-9替换为字符串中对应的数字0-9。
我创建了两个数字单词和数字数组,然后尝试使用替换循环来更改句子。
不确定我做错了什么。
我引用了我的getNoDigitWordString
方法。
import java.util.*;
public class StringProcessor {
private String noSpaces;
private String input, noVowels;
private String noDigitWords;
private int numOfWords = 0, uppercaseLetters = 0,
numOfDigits = 0, digitWords = 0;
private String [] wordDigits = {"zero","one", "two", "three","four",
"five", "six", "seven", "eight", "nine"};
private String [] digits = {"0", "1", "2", "3", "4",
"5", "6", "7", "8", "9"};
public StringProcessor()
{
input = "";
}
public StringProcessor(String s)
{
StringTokenizer str = new StringTokenizer(s);
numOfWords = str.countTokens();
for (int i = 0; i < s.length(); i++)
{
if (Character.isUpperCase(s.charAt(i)))
uppercaseLetters++;
}
for (int i = 0; i < s.length(); i++)
{
if (Character.isDigit(s.charAt(i)))
numOfDigits++;
}
String [] strSplit = s.split(" ");
for(int i = 0; i < strSplit.length; i++)
{
for (int j = 0; j < wordDigits.length; j++)
{
if (strSplit[i].equalsIgnoreCase(wordDigits[j]))
digitWords++;
}
}
noSpaces = s.replace(" ","");
noVowels = s.replaceAll("[aeiou]", "-");
for(int i = 0; i < 10; i++)
{
noDigitWords = s.replace("wordDigits[i]", "digits[i]");
}
}
public void setString(String s)
{
input = s;
}
public String getString()
{
return input;
}
public int wordCount()
{
return numOfWords;
}
public int uppercaseCount()
{
return uppercaseLetters;
}
public int digitCount()
{
return numOfDigits;
}
public int digitWordCount()
{
return digitWords;
}
public String getNoSpaceString()
{
return noSpaces;
}
public String getNoVowelString()
{
return noVowels;
}
public String getNoDigitWordString()
{
return noDigitWords;
}
public static void main(String[] args)
{
String input;
Scanner keyboard = new Scanner(System.in);
System.out.print("Enter a line of text: ");
input = keyboard.nextLine();
StringProcessor str = new StringProcessor(input);
System.out.println("words: " + str.wordCount());
System.out.println("uppercase: " + str.uppercaseCount());
System.out.println("digits: " + str.digitCount());
System.out.println("digit words " + str.digitWordCount());
System.out.println("line with no spaces: " + str.getNoSpaceString());
System.out.println("line with vowels replaced: " + str.getNoVowelString());
System.out.println("line with digit words replaced: " + str.getNoDigitWordString());
}
}
感谢。
答案 0 :(得分:4)
这就是你要找的东西:
noDigitWords = s;
for(int i = 0; i < strSplit.length; i++)
{
for (int j = 0; j < wordDigits.length; j++)
{
if (strSplit[i].equalsIgnoreCase(wordDigits[j])){
noDigitWords = noDigitWords.replace(strSplit[i], digits[j]);
break;
}
}
}
而不是:
for(int i = 0; i < 10; i++)
{
noDigitWords = s.replace("wordDigits[i]", "digits[i]");
}
答案 1 :(得分:2)
除了@dcharms指出的问题,这不起作用:
for(int i = 0; i < 10; i++)
{
noDigitWords = s.replace(wordDigits[i], digits[i]);
}
以下是发生的情况:首先,您在s
搜索"zero"
,然后致电s.replace
。此返回一个字符串,其中"zero"
替换为"0"
。然后将该字符串分配给noDigitWords
。 但s
本身并未改变。
然后,下次循环时,您将在原始 s
中搜索下一个单词。您在上一次迭代中所做的工作(noDigitWords
)将被丢弃。
结果将是您搜索的最后一个单词"nine"
应该被替换。但是你所做的任何其他替换都将被丢弃。
答案 2 :(得分:1)
尝试将noDigitWords = s.replace("wordDigits[i]", "digits[i]");
替换为noDigitWords = s;
外部for循环和
noDigitWords = noDigitWords.replaceAll(wordDigits[i], digits[i]);
内部。
原作正在寻找字符"wordDigits[i]"
,而不是wordDigits[i]
的内容。您的输出有类似的问题。
答案 3 :(得分:1)
以下代码每次调用replace
方法时,都会覆盖字符串noDigitWords
。
for(int i = 0; i < 10; i++)
{
noDigitWords = s.replace("wordDigits[i]", "digits[i]");
}
在循环的最后一次迭代之后,字符串&#34;一个九&#34;成为&#34;一个9&#34;而不是&#34; 1 9&#34;如预期的。解决方案是在循环的前一次迭代的返回值上调用replace
方法。将字符串noDigitWords
初始化为字符串s
的值。每次迭代都在noDigitWords
上进行替换,如下所示。
noDigitWords = s;
for(int i = 0; i < 10; i++)
{
noDigitWords = noDigitWords.replace(wordDigits[i], digits[i]);
}