有效地从控制台获取输入

时间:2016-09-05 07:45:29

标签: java

我正在研究uva 00787

(来自网站uva在线评审员的问题:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=9&page=show_problem&problem=728

获取数字列表并查找产生最大产品的列表的子序列。但实际上,程序只显示最大的产品,实际上不是子序列,或者它的起始和结束指数。

我想我已经建议使用java的BigInteger来包含一个非常大的数字,列表中可能有一百个数字,每个数字可能是5位数,因此最大值可以是99999 ^ 100(非常大!!)。考虑到这些知识,使用BigInteger是有意义的。

现在,我的问题要简单得多。我的主要偏好是C ++,在编写代码时我必须更多地考虑java的语言,我认为可能有一种比我所做的更简单的解析方法。我基本上使用Scanner类和String类,然后使用字符串解析从一行文本中获取我想要的值。这就是我的所作所为(作为一个简单的例子):

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int next;
    String number = scanner.nextLine();
    while(!number.isEmpty())
    {
        do
        {
            next = Integer.parseInt(number.substring(0, number.indexOf(' ')));
            number = number.substring(number.indexOf(' ') + 1, number.length());
            System.out.println(Integer.toString(next));
        }while(!number.equals("-999999"));
        System.out.println(number);
        number = scanner.nextLine();
    }
}

这里发生的事情是,我从控制台获取一行,然后使用" -999999"作为哨兵价值。循环解析列表中的每个整数,并在控制台上给出它的值。一次" -999999"检测到,然后循环结束。然后,程序等待另一行,将其踢回循环,寻找" -999999"的标记值,除非由于用户只按下回车键,下一行为空。然后外循环终止,程序也是如此。

我不是特别喜欢这个解决方案,但我无法想到更好的方法。我很难描述为什么我不喜欢它。或许这只是因为我感觉它比需要的更复杂。

感谢您提供的任何指导,

布伦特。

1 个答案:

答案 0 :(得分:0)

你可以这样做:

Scanner sc = new Scanner(System.in);        
List<Integer> list;

while(sc.hasNext()) { // until EOF
    list = new ArrayList<>();
    while(sc.hasNextInt()) {
        int n = sc.nextInt();
        if(n == -999999)
            break;
        list.add(n);
    }
    System.out.println(list);
    // Your list of numbers are ready. Do whatever you need.
}