【问题标题】:Loops required to to add up a sum of numbers written in text将文本中数字的总和相加所需的循环
【发布时间】:2013-06-28 14:36:50
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 如果您显示您的代码,我们可以告诉您为什么它不断添加第一个数字
  • 标题中不需要添加major标签。将值放入一个数组中(如果您知道启动时会有多少,或者是一个可扩展的集合(例如ListArrayList)。它们都很容易迭代。
  • 我会贴出我写的代码...

标签: java loops numbers


【解决方案1】:

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

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

我还建议将数字的文本表示形式放在地图中,这样您就可以使用输入单词更快地查询它(另一种选择是检查 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);
}

虽然您没有提及,但您可能有一个数字“三百”。这个解决方案不适合那个。

【讨论】:

  • 这样"three hundred" 的总和为103 而不是300
  • 那是正确的,但我需要一个 do while 循环将它们组合在一起吗?
  • @jlordo 这是他的规格。
【解决方案2】:

据我了解,您可以执行以下操作:使用 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
   }
}

【讨论】:

    【解决方案3】:

    我会推荐一个 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。

    【讨论】:

    • 即使是 Java API 也推荐 NOT 使用 StringTokenizer... 最好使用String#split
    • 它没有被弃用,这使它成为一个选项。对于此应用程序,它可以完美运行。如果您尝试使用 /r/n 或其他方式进行拆分,我同意 String.split 是一个更好的选择。
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 2018-09-13
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多