【Java】 Scannerクラスで改行文字で区切る、スキップして読み込むなど
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()は使ってないです(
上手くできなかった)
参考: