読者です 読者をやめる 読者になる 読者になる

ハイパーニートプログラマーへの道

頑張ったり頑張らなかったり

【Java】 Scannerクラスで改行文字で区切る、スキップして読み込むなど

Qiitaで見つけたこの記事のコードを少し改変しまして

Javaで挿入ソート - Qiita

上記記事ですと1番初めの数字を配列の要素数としているのですけど、好きなだけ(?)数字を入れてソートするようにしたいなと。

そして改変したはいいんですけど、ターンっとリターンを押したらソート開始するようにしたかったんですが、どうしても分からないのでteratailで質問しました。(ユーザーしか見れない?かも)

[Java] Scanner#hasNextInt()の使い方について|teratail

そしたら解答がきたので、以下のようにしたらできました。

Scanner#useDelimiter()を使用してまず改行文字で区切る。
そしてまた新たに読み込んで(今度はデフォルトの空白で区切る形)リストにひとつづつトークンを追加していけばよいと。

import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;
import java.util.ArrayList;
import java.io.StringReader;

public class InsertionSort {

    public static void main(String[] args) throws IOException {

        System.out.println("数字を空白区切りで入力してください。");
        ArrayList<Integer> AL = new ArrayList<Integer>();
        Scanner scanner = new Scanner(System.in);

        // scanner.useDelimiter("[\r\n]+");
        scanner.useDelimiter(System.getProperty("line.separator"));

        // scanner = new Scanner(new StringReader(scanner.next()));
        scanner = new Scanner(scanner.next());

        while (scanner.hasNextInt()) {
            AL.add(scanner.nextInt());
        }

        int[] A = new int[AL.size()];
        for (int i = 0; i < AL.size(); i++) {
            A[i] = AL.get(i);
        }

        // insertionsort from here
        for (int j = 1; j < A.length; j++) {
            int key = A[j];
            int i = j - 1;
            while (i >= 0 && A[i] > key) {
                A[i + 1] = A[i];
                i--;
            }
            A[i + 1] = key;
            System.out.println(Arrays.toString(A).replaceAll("[,\\[\\]]", ""));
        }
    }
}

ただこれだと、例えば数字のあいだに文字列が入っていると、その手前までしか読み込まない。

数字を空白区切りで入力してください。
1 9 2 noriyo_tcp 8
1 9 2
1 2 9

整数以外はスキップしたいぞということで修正。

       /*
       while (scanner.hasNextInt()) {
           AL.add(scanner.nextInt());
       }
       */

        // 次のトークンがInt型だったらリストに追加
        // そうでなければそのまた次を読む
        while (scanner.hasNext()) {
            if (scanner.hasNextInt()) {
                AL.add(scanner.nextInt());
            } else {
                scanner.next();
            }
        }

これで

数字を空白区切りで入力してください。
1 9 2 noriyo_tcp 8
1 9 2 8
1 2 9 8
1 2 8 9

整数以外をスキップしてソートしてくれる。
タイトルにスキップとありますが、Scanner#skip()は使ってないです( 上手くできなかった)

参考:

Java Scanner example | Examples Java Code Geeks