将数字单词替换为数字

时间:2014-04-07 23:32:11

标签: java string replace

我正在尝试将所有数字字零-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());
}
}

感谢。

4 个答案:

答案 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"。然后将该字符串分配给noDigitWordss本身并未改变

然后,下次循环时,您将在原始 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]);
}