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()」を呼び出さなかったからですか? これらの2つの質問で私を助けてください。

ありがとう。

4

5 に答える 5

4

Enter キーを押すと行区切りが表示され、その文字は区切り文字として扱われ (デフォルトではCharacter.isWhitespace()を参照)、スキップされます。したがって、Scannerはさらなる入力を待っていますが、それは決して到着せず、hasNextInt()はブロックされます。.たとえば、ループを終了させるには、整数ではない何かを入力します。

1 2 5 3 7 .

于 2012-06-30T12:07:16.917 に答える
1

のように 1 行だけで入力したい場合は2,1,6,7,3、おそらくnextLine()スキャナーを使用する方が簡単でしょう:

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

Enterキーを押すと、スキャナーが終了します。この時点で、文字列に入力があるため、その文字列を解析してすべての数値を取得する必要があります。

また、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 に答える
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

スキャナは、入力の最後に到達するか、読み取りに失敗するまでスキャンを続けます (たとえば、テキスト内に整数以外が検出された場合)。

Enterキーを押した後、ctrl + Dキーを押します。数字は任意の空白で区切ることができます。

于 2012-06-30T12:14:43.160 に答える
0

コードが機能するはずです。ループから抜け出す方法を追加するだけです。また、再度参照する必要がある場合に備えて、スキャンした値をローカル変数に保持しておくことをお勧めします。

多分追加:

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

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