【问题标题】:Replacing digit words into digits将数字单词替换为数字
【发布时间】:2014-05-20 10:29:35
【问题描述】:

我正在尝试将字符串中的所有数字单词 0-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());
}
}

谢谢。

【问题讨论】:

  • 你的错误到底在哪里?
  • 我的输出不会从一变为一。它保持为一。
  • 你能把你的输出吗?顺便说一句,我认为它保持在一个,因为你调用了每个方法一次。在main 方法上尝试for 循环,在System.out.println("words: " + str.wordCount()); 之前
  • 我的意思是,你的实际输出和预期输出是多少
  • 我的输入是“这是那个”。输出是“this is the one”。预期输出应该是“this is the 1”

标签: java string replace


【解决方案1】:

这就是你要找的:

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]");
}

【讨论】:

  • 我试过这个,但如果我输入两个数字,比如一和九,只有九个变为“9”。但是当我在句子中只输入一个数字时,它们会变成相应的数字
  • @PurpleVermont 请注意:不要在 StackOverflow 上使用“下面”之类的词,因为它喜欢重新排列答案。 :)
  • 这不起作用,原因与 ajb 在他/她的回复中解释的原因相同
  • 为了清楚起见,您应该将 s 复制到一个新变量,然后修改该变量。在这种情况下你可以侥幸逃脱,因为 noDigitWords 恰好是最后计算出来的东西,但是如果他改变主意并想在它之后添加一个新的变体,那么这个新的东西就行不通了,因为你已经修改了原始字符串(s)。别管 s,从一开始就处理 noDigitWords。
  • @PurpleVermont 然后,就是这样
【解决方案2】:

除了@dcharms 指出的问题,这是行不通的:

for(int i = 0; i < 10; i++)
{
    noDigitWords = s.replace(wordDigits[i], digits[i]);
}

发生的情况如下:首先,您在s 中搜索"zero",然后调用s.replace。这返回一个字符串,其中单词"zero" 替换为"0"。然后将该字符串分配给noDigitWordss本身并没有改变

然后,下一次循环时,您在 original s 中搜索下一个单词。您在上一次迭代中所做的工作(在 noDigitWords 中)被丢弃了。

结果将是您搜索的最后一个词 "nine" 应该被替换。但是您所做的任何其他替换都将被丢弃。

【讨论】:

  • 我用“9”运行了一个输入,我看到了你所描述的。我只是对如何使所有更改生效感到困惑。
  • 使用相同的变量。从noDigitWords = s; 开始,然后是noDigitWords = noDigitWords.replace(...)
  • 已编辑,因为 "" + digits[i] 不是必需的,只需 digits[i] 就足够了。但如果digits[i]int[] 数组而不是String[],则"" + 会很有用。
【解决方案3】:

以下代码每次调用replace 方法时,都会覆盖字符串noDigitWords

for(int i = 0; i < 10; i++)
{
    noDigitWords = s.replace("wordDigits[i]", "digits[i]");
}

在循环的最后一次迭代之后,字符串“one 9”变成了“one 9”,而不是“1 9”。解决方法是在循环上一次迭代的返回值上调用replace 方法。将字符串noDigitWords初始化为字符串s的值。每次迭代都会对noDigitWords 进行替换,如下所示。

noDigitWords = s;
for(int i = 0; i < 10; i++)
{
    noDigitWords = noDigitWords.replace(wordDigits[i], digits[i]);
}

【讨论】:

    【解决方案4】:

    尝试将 noDigitWords = s.replace("wordDigits[i]", "digits[i]"); 替换为 for 循环外部的 noDigitWords = s; 和内部的 noDigitWords = noDigitWords.replaceAll(wordDigits[i], digits[i]);

    您的原始文件正在寻找字符串"wordDigits[i]",而不是wordDigits[i] 的内容。您的输出也有类似的问题。

    【讨论】:

    • 仍然没有改变我的句子。我觉得这应该可行,但不是。
    • 你输入的句子是什么?
    猜你喜欢
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 2017-03-08
    • 2020-04-26
    相关资源
    最近更新 更多