0

我正在尝试 Java 教程中的一个问题,我必须创建一个程序来输出句子中的数字总和。尽管数字是以文本格式编写的。尽管我偶然发现了一些我想要一些建议的困难,但我想自己完成这项工作。

问题的一个例子是,一个孩子有 13 个气球,并以 300 美分的价格出售。

显然我必须设置变量,以便将字符串数字转换为整数,例如

int one = 1, two = 2, three = 3, twelve = 12, thirty = 30, hundred = 100;

我最初的尝试是创建一个循环,其中我分配了一个计数以在所有数字都累积后停止,尽管循环继续添加第一个数字。

我的问题是,当我使用扫描仪对象输入文本时,需要什么循环来添加第一个(书面)数字,然后移动到第二个(书面)数字,这将被添加到 sum 变量中?

感谢您抽出宝贵时间,我希望这个问题很容易理解。

4

4 回答 4

1

我的问题是,当我使用扫描仪对象输入文本时,需要什么循环来添加第一个(书面)数字,然后移动到第二个(书面)数字,这将被添加到 sum 变量中?

不确定我是否理解,但首先您逐字阅读(在一个循环中,对),并为每个单词检查它是否与文本数字列表中的一个字符串匹配(“一”、“五十”、“百万”) . 如果匹配,则将该数字添加到总和中。

我还建议将数字的文本表示形式放在地图中,这样您就可以使用输入单词更快地查询它(另一种选择是检查 ArrayList 是否包含该单词,并且对许多单词进行多次迭代会更慢)。

Map<String, Integer> map = new HashMap<String, Integer>();
map.put("one", 1);

该程序将执行以下操作:

int sum=0;
for (String word : text) {
    Integer value= map.get(key);
    sum += (value == null ? 0 : value);
}

尽管您没有提及,但您可能有一个数字“三百”。该解决方案对此不利。

于 2013-06-28T14:42:12.270 回答
1

据我了解,您可以执行以下操作:使用 while(scanner.hasNext()) 遍历扫描仪,然后将临时变量分配给扫描仪抓取的下一个元素。检查它是否匹配任何数字,如果它确实将它添加到在 while 循环之外定义的计数变量中。

int count = 0;
Scanner sc = new Scanner(system.in);
while(sc.hasNext()){
  String temp = sc.next()
  if(temp.equals(arrayOfNumbers){
     //add the number to the variable count
   }
}
于 2013-06-28T14:56:04.193 回答
1

我会推荐一个 StringTokenizer。这将允许您一个一个地分析每个单词。

StringTokenizer st = new StringTokenizer(yourString);
String firstNumber = st.nextToken();
String secondNumber = st.nextToken();

比较这些数字的一个好方法是设置数组,其索引以某种方式对应于它们的值(即“一”将指向 DIGITS[0])。

public static final String[] DIGITS = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", null};
public static final String[] TENS = {null, "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety", null};
public static final String[] TEENS = {"ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};

剧透警告:下面是我最近写的一个粗略的方法,用于将一个数字(低于 1 万亿)从一串单词转换为一个数字。可能是您正在寻找的。同样,如果这是为了自学,我不建议复制/粘贴代码,而是了解它是如何工作的。

public static final String[] DIGITS = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", null};
public static final String[] TENS = {null, "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety", null};
public static final String[] TEENS = {"ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};
public static final String[] MAGNITUDES = {null, null, null, "thousand", null, null, "million", null, null, "billion", null, null, "trillion"};
public static final String[] ZERO = {"zero", "oh"};

public static double wordToNumber(String input) {
    double result = 0;
    String[] decimal = input.split("point");
    StringTokenizer set = new StringTokenizer(decimal[0]);

    boolean negative = false;
    if (input.contains("negative")) {
        negative = true;
    }

    double group = 0;

    while (set.hasMoreTokens()) {
        String word = set.nextToken();

        for (int i = 0; i < MAGNITUDES.length; i += 3) {
            if (word.equals(MAGNITUDES[i])) {
                group = group * Math.pow(10, i);
                result = result + group;
                group = 0;
            }
        }

        if (word.equals("hundred")) {
            group = group * 100;
        }
        else {
            for (int i = 0; i < 10; i++) {
                if (word.equals(DIGITS[i])) {
                    group = group + i + 1;
                }
                if (word.equals(TEENS[i])) {
                    group = group + 10 + i;
                }
                if (word.equals(TENS[i])) {
                    group = group + 10 * (i + 1);
                }
            }
        }
    }

    result = result + group;

    if (decimal.length > 1) {
        StringTokenizer hang = new StringTokenizer(decimal[1]);
        int n = -1;

        while (hang.hasMoreTokens()) {
            String word = hang.nextToken();

            for (int i = 0; i < 10; i++) {
                if (word.equals(DIGITS[i])) {
                    result = result + (i + 1) * Math.pow(10, n);
                }
            }

            n--;
        }
    }

    if (negative) {
        result = result * (-1);
    }

    return result;
}

输入“负七千八百三十万六百零五零七”返回值的双倍 -78380601.507。

于 2013-06-28T14:56:44.793 回答
0

我不确定我的问题是否正确。但似乎你想在计算它们的同时转换书面文本中的数字以转换数值。

所以你需要在文本和数字之间建立一种映射。然后你可以得到数值并添加它们。

但是您必须为每个可以找到您的号码定义一个映射。

于 2013-06-28T14:55:39.920 回答