【问题标题】:Output multiple strings from scanner input从扫描仪输入输出多个字符串
【发布时间】:2014-10-30 01:42:16
【问题描述】:

我的程序的目的是从用户那里接受整数、双精度和字符串,当程序通过输入单词“quit”终止时,程序会平均整数和双精度,并输出提交的字符串。这是我目前所拥有的:

import java.util.*;

public class Lab09 {
    public static void main(String [] args) {
        Scanner console = new Scanner(System.in);

      double sumI = 0;
      double sumD = 0;
      String words = "";
      int numInputInt = 0;
      int numInputDoub = 0;
        do {
            System.out.print("Enter something: ");
            if (console.hasNextInt()) {
               int numI = console.nextInt();

            if (numI >= -100 && numI <= 100) {
               sumI += numI;
               numInputInt++;
            }
            else {
               System.out.println("Integer out of range!(-100 .. 100)");
            }

            }
         else if (console.hasNextDouble()) {
            double numD = console.nextDouble();
            if (numD >= -10.0 && numD <= 10.0) {
               sumD += numD;
               numInputDoub++;
            }
            else {
               System.out.println("Double out of range!(-10.0 .. 10.0)");
            }   

         }
         else {
            words = console.next();
         }

        } while (!words.equalsIgnoreCase("quit")); 
        System.out.println("Program terminated...");
      double avgInt = sumI / numInputInt;
      double avgDoub = sumD / numInputDoub;

      if (numInputInt > 0) {
         System.out.println("\tAveragae of Integers: " + avgInt);
      }
      else {
         System.out.println("\tNo intergers submitted");
      }
      if (numInputDoub > 0) {
         System.out.println("\tAverage of Doubles: " + avgDoub);
      }
      else {
         System.out.println("\tNo doubles submitted");
      }
      System.out.println(words);


   }

}

int 和 double 处理得很好,但我卡在字符串中。关于如何去做的任何想法? 提前致谢!

【问题讨论】:

    标签: java string java.util.scanner


    【解决方案1】:

    虽然您可以构建一个 List&lt;String&gt; 的单词,但看起来您只是想将每个新单词连接到您的 String words 之类的,

    if (words.length() > 0) words += " "; // <-- add a space.
    words += console.next(); // <-- += not =
    

    然后将您的循环测试更改为类似,

    while (!words.trim().toLowerCase().endsWith("quit"));
    

    它应该像你期望的那样工作。

    【讨论】:

    • te 字符串“quit”的情况无关紧要,循环测试中不需要它吧?
    • 定义无所谓。如果你的意思是它总是小写,那么你可以跳过toLowerCase()
    • 使用你的方法我得到了一个无限循环
    • 是否需要trim?输入是在空格之后添加的......不是吗?
    • @MadProgrammer 我假设 OP 正在获取回车符或换行符;无法理解否则它将如何无限循环。
    【解决方案2】:

    你可以使用

    String input = "";
    do {
        //...
        }
        else {
            input = console.next();            
            words += input + " ";
        }
        console.nextLine(); // Read the carriage return
    } while (!input.equalsIgnoreCase("quit")); 
    //...
    System.out.println(words.trim());
    

    连接文本,但在循环中完成时效率相当低。

    更好的解决方案是使用StringBuilder...

    StringBuilder work = new StringBuilder(128);
    String input = "";
    do {
        //...
        }
        else {
            input = console.next();            
            words.append(" ").append(input);
        }
        console.nextLine(); // Read the carriage return
    } while (!input.equalsIgnoreCase("quit")); 
    //...
    System.out.println(words);
    

    【讨论】:

    • 谢谢,但除了我用过的类,我不能使用任何其他类
    • StringBuilder 在循环中效率很高,因为您不会创建“大量”临时Strings,否则,第一个示例应该让您开始......
    • 另外,我不会使用words 来检查退出条件,只有当用户输入quit 作为第一个单词时,它才会为真...
    【解决方案3】:

    我刚刚看了你的评论,你不能使用任何其他类,试试这个:

    import java.util.*;
    
    public class Lab09 {
        public static void main(String [] args) {
            Scanner console = new Scanner(System.in);
    
          double sumI = 0;
          double sumD = 0;
          String words = "";
          int numInputInt = 0;
          int numInputDoub = 0;
            do {
                System.out.print("Enter something: ");
                if (console.hasNextInt()) {
                   int numI = console.nextInt();
    
                if (numI >= -100 && numI <= 100) {
                   sumI += numI;
                   numInputInt++;
                }
                else {
                   System.out.println("Integer out of range!(-100 .. 100)");
                }
    
                }
             else if (console.hasNextDouble()) {
                double numD = console.nextDouble();
                if (numD >= -10.0 && numD <= 10.0) {
                   sumD += numD;
                   numInputDoub++;
                }
                else {
                   System.out.println("Double out of range!(-10.0 .. 10.0)");
                }   
    
             }
             else {
                words = words.concat(" ").concat(console.next());
    
             }
    
            } while (!words.contains("quit")); 
            System.out.println("Program terminated...");
          double avgInt = sumI / numInputInt;
          double avgDoub = sumD / numInputDoub;
    
          if (numInputInt > 0) {
             System.out.println("\tAveragae of Integers: " + avgInt);
          }
          else {
             System.out.println("\tNo intergers submitted");
          }
          if (numInputDoub > 0) {
             System.out.println("\tAverage of Doubles: " + avgDoub);
          }
          else {
             System.out.println("\tNo doubles submitted");
          }
          System.out.println(words);
    
    
       }
    
    }
    

    【讨论】:

    • 为什么使用buffer.append(" "+word);
    • 事实上,为什么要使用StringBuffer呢?
    • 我不能为这个程序使用其他类方法
    • @MadProgrammer 如果项目需要任何其他扩展或者他需要的不仅仅是字符串,这个类非常有用和安全。
    • 你明白为什么你应该使用StringBuffer,它试图达到什么目的吗?因为你的例子表明你没有。由于它不是线程程序,因此不需要StringBuffer 提供的添加同步,还有其他可用的解决方案...
    猜你喜欢
    • 2011-08-23
    • 2020-09-07
    • 2012-12-06
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    相关资源
    最近更新 更多