0

请看下面的代码。这是我尝试按升序管理给定数字的尝试。

import java.io.*;
import java.util.*;
import java.util.ArrayList;

public class TurboSort
{
    public static void main(String[]args)
    {

        List<Integer> numbers = new ArrayList();        
        Scanner scan = new Scanner(System.in);

        while(scan.hasNextInt())
        {
            numbers.add(scan.nextInt());
        }


        Collections.sort(numbers);

        System.out.println(numbers);
    }
}

将输入插入为 2,1,6,7,3

点击进入。

现在,扫描仪还没有退出 while 循环,因为它没有给出任何输出。我在这里做错了什么?即使你设法得到它,输出也会被括号括起来,比如“ [1] [2] [3] ”。这是为什么?那是因为我没有调用 'Integer.parseInt()' 吗?请帮我解决这两个问题。

谢谢。

4

5 回答 5

4

按回车的结果将是一个行分隔符,其字符被视为分隔符(默认情况下,请参阅Character.isWhitespace())并被跳过。因此,Scanner等待进一步的输入,它永远不会到达并且hasNextInt()将阻塞。输入一些不是整数的东西,例如 a .,以使循环终止:

1 2 5 3 7 。

于 2012-06-30T12:07:16.917 回答
1

这个循环永远不会退出(只要你输入整数),因为没有break条件

while(scan.hasNextInt()){
  numbers.add(scan.nextInt());
}

如果你想让你的循环停止,比如说你只需要获取 5 个整数,那么你可以这样做:

while(scan.hasNextInt()){
  numbers.add(scan.nextInt());
  if(numbers.size() == 5) break;
}
于 2012-06-30T12:08:57.360 回答
1

Scanner 继续扫描直到输入结束,或者直到它无法读取(例如,当在文本中检测到非整数时)。

按回车后按 ctrl + D。您可以将数字分隔任何空白。

于 2012-06-30T12:14:43.160 回答
1

如果您只想在 1 行上输入2,1,6,7,3,可能会更容易使用nextLine()扫描仪:

Scanner scan = new Scanner(System.in);
String consoleInput = scan.nextLine();

一旦你按下回车键,这将终止扫描程序。此时,您有一个字符串中的输入,您必须解析该字符串并取出所有数字。

另请注意,您忘记参数化 ArrayList()。

这是您的源代码的可能改编:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Main {
  public static void main(String[] args) {

    Scanner scan = new Scanner(System.in);

    String consoleInput = scan.nextLine();

    List<Integer> numbers = new ArrayList<Integer>();


    if (consoleInput.length() > 0 && consoleInput.contains(",")) {

      String[] numbersAsStrings = consoleInput.split(",");

      for (String tNumberAsString : numbersAsStrings) {
        try {
          int tNumber = Integer.parseInt(tNumberAsString);

          numbers.add(tNumber);

        } catch (NumberFormatException nfe) {
          System.out.println(tNumberAsString + " is not a number");
        }
      }

      Collections.sort(numbers);

      System.out.println(numbers);

    } else {
      System.out.println("Nothing to sort!");
      System.out.println(numbers);
    }

  }
}
于 2012-06-30T13:04:59.483 回答
0

您的代码应该可以工作。您只需要添加一种方法来跳出循环。将扫描的值保存在局部变量中也是一个好主意,以防您需要再次引用它。

也许添加:

while(scan.hasNextInt()){
    int i=scan.nextInt();
        if(i==-1)
            break;

    numbers.add(i);
}
于 2012-06-30T12:10:23.803 回答