Javaでの整数値昇順ソートプログラムでエラーが発生する

このQ&Aのポイント
  • javaを使用してn個の整数値を入力し、昇順に並べ替えるプログラムを作成しましたが、エラーが発生しています。
  • 数字を,で区切って入力するとエラーが発生し、結果が表示されません。
  • 問題を解決するために、数字の区切りを改行に変更する必要があります。また、コードに誤りがあれば指摘いただけると助かります。
回答を見る
  • ベストアンサー

javaに関する質問

n個の整数値を入力し、それらの値を昇順に並べ替えるプログラムを書いたのですがエラーにより問題が発生しました。 問題は下記の実行例のように数字を,で区切り入力すると、エラーが発生し結果が表示されないという問題です。(Enterで改行するように区切ればエラーなく実行されます) 実行例として 整数値を入力してください。 1,5,7,3 ← 手入力部分 1,3,5,7 ← 実行結果 となれば正解のようです。 これが僕の書いたコードです。 package jp.javadrive; import java.util.Arrays; import java.util.Scanner; public class Java { public static void main(String[] args) { System.out.println("整数値を入力してください。"); @SuppressWarnings("resource") Scanner a = new Scanner(System.in); @SuppressWarnings("resource") Scanner b = new Scanner(System.in); @SuppressWarnings("resource") Scanner c = new Scanner(System.in); @SuppressWarnings("resource") Scanner d = new Scanner(System.in); int a1 = a.nextInt(); int b1 = b.nextInt(); int c1 = c.nextInt(); int d1 = d.nextInt(); int[] arr = new int[]{a1,b1,c1,d1}; Arrays.sort(arr); for(int i = 0;i < arr.length;i++) System.out.print(arr[i]); } } 初めてjavaを触った為、ググりながら書いていたので仕組みを分かっていないところがあるので、間違っている箇所があればどしどしご指摘お願いします。

  • Java
  • 回答数15
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

Enterでデータの終了になります、データの個数は1個以上なら いくつでもOKです(「1,5,7,3,2,4,6」とかでも入力可能) import java.util.Arrays; import java.util.Scanner; public class test { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String line = scanner.nextLine(); String[] item = line.split(","); int[] array = new int[item.length]; for( int i = 0; i<item.length; i++){ array[i] = Integer.parseInt(item[i]); System.out.println("main( ):" + "i=" + i + "; " + "array[i]=" + array[i] + "; " + ""); } Arrays.sort(array); for( int i = 0; i<array.length; i++){ System.out.print(array[i] + ", "); } } }

その他の回答 (14)

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.15

回答No.9から考え方を少し変えてカンマ区切りの数値データを1つの文字列データと考えてsplitメソッドで文字列の配列変数へ代入して数値データの配列変数へ変換する方法を検証してみました。 この方法では入力する数値の個数は可変になります。 package jp.javadrive; import java.util.Arrays; import java.util.Scanner; public class Java { String buf = new String(); public static void main(String[] args) { @SuppressWarnings("resource") Scanner a = new Scanner(System.in); System.out.println("整数値を入力してください。"); String buf = new String(a.next()); String[] arr = buf.split(",",0); int[] arrv = new int[arr.length]; for(int i = 0; i < arr.length; i++) arrv[i] = Integer.valueOf(arr[i]); Arrays.sort(arrv); buf = new String(); for(int i= 0; i < arrv.length; i++) buf =buf + arrv[i] + " "; buf = buf.trim(); buf = buf.replaceAll(" ",","); System.out.println(buf); } }

回答No.14

カンマ「,」、Enterの どちらでも複数のデータを入力できます。 終了する場合、入力待ちで何もデータを入力しないでEnterだけ入力するか、「Ctrl+Z」を入力する。 import java.util.ArrayList; import java.util.Arrays; import java.util.NoSuchElementException; import java.util.Scanner; //クラス名は自分のプログラムのクラス名に変更して下さい。 public class test { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); scanner.useDelimiter(",|\r\n|\n|\r"); /* プログラマーが改行を直に扱う場合には注意が必要です。 Javaの改行の実装は どうなっているのか知りませんが、下記は改行のスタンダードな実装です。 # 【エスケープ文字のコード】 #    # Windows  # UNIX  # Mac  # # "\n" # \x0A   # \x0A  # \x0D  # # "\r" # \x0D   # \x0D  # \x0A  # # 【print時など】 #    # Windows  # UNIX  # Mac  # #改行(\n)# \x0D\x0A # \x0A  # \x0D  # # "\r" # \x0D   # \x0D  # \x0A  # */ ArrayList<Integer> list = new ArrayList<Integer>(); int n = 0; do{ try{ int data = scanner.nextInt(); if( "".equals(data) ){ break; } list.add(data); // list配列(リスト)の最後に要素を追加。 // int型(プリミティブ型)からInteger型(ラッパークラス)へ自動変換される、 // それをオートボクシングと言う。 } catch(NoSuchElementException ex){ break; } System.out.println("main( ):" + "n=" + n + "; " + "list.get(n)=" + list.get(n) + "; " + ""); n++; }while(true); int[] array = new int[list.size()]; for( int i = 0; i<list.size(); i++ ){ array[i] = list.get(i); // Integer型(ラッパークラス)からint型(プリミティブ型)へ自動変換される、 // それをアンボクシングと言う。 } Arrays.sort(array); System.out.println("sort"); for( int i = 0; i<array.length; i++){ System.out.print(array[i] + ", "); } } }

回答No.13

>回答No.12 amanojaku1 ArrayListは通常の配列とは違うので注意が必要。 下記はArrayListの主なメソッド。 配列(リスト)の要素の数:size() 配列(リスト)の最後に要素を追加する:add(E element) 配列(リスト)の指定された位置に要素を挿入:add(int index, E element) 配列(リスト)の指定された位置にある要素に代入:set(int index, E element) 配列(リスト)内の指定された位置にある要素を返す:get(int index) 配列(リスト)の要素ががない場合に true を返す:isEmpty() 配列(リスト)の指定された位置の要素を削除する:remove(int index)

回答No.12

>回答No.11 amanojaku1 >ArrayListは可変長配列なので要素を追加可能。 >確かプリミティブ型は不可なので、オブジェクトで保存(つまり「int」で保存したくても「Integer」になる)。 Integer用のArrayListを定義してい場合は下記のような感じ。 ArrayList<Integer> 変数名 = new ArrayList<Integer>();

回答No.11

>回答No.10 amanojaku1 ArrayListは可変長配列なので要素を追加可能。 確かプリミティブ型は不可なので、オブジェクトで保存(つまり「int」で保存したくても「Integer」になる)。 Arrayでは無いので「Arrays.sort(~)」は使えないから、ArrayListをArrayに転換してから「Arrays.sort(~)」してやればOK。

回答No.10

>キーボードから入力したデータの個数を検出する手法 「scanner.next~」をtry-catchし、catchにbreakを記述、「Ctrl+Z」でループをbreakする。 またはデータを何も入力しないでEnterだけ入力されたかを判定してループをbreakする(こちらの方が簡単)。

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.9

回答No.1の検証結果を提示します。 入力データが4個の場合です。 キーボードから入力したデータの個数を検出する手法が見当たらなかったので固定にしました。データを入力する前にデータの個数をキーボードから別途入力すればデータの個数を可変にできます。 package jp.javadrive; import java.util.Arrays; import java.util.Scanner; public class Java { public static void main(String[] args) { System.out.println("整数値を入力してください。"); @SuppressWarnings("resource") Scanner a = new Scanner(System.in); int[] arr = new int[4]; for(int i = 0; i < 4; i++) arr[i] = a.nextInt(); Arrays.sort(arr); String buf = new String(); for(int i= 0; i < 4; i++) buf =buf + arr[i] + " "; buf = buf.trim(); buf = buf.replaceAll(" ",","); System.out.println(buf); } } 貼付画像はEclipse Oxygenで検証した結果です。

回答No.8

Javaのエスケープ文字のコードは下記のようになっているようです(Macのスタンダードな実装と違う事に注意して下さい)。 あくまでもJavaのエスケープ文字のコードであってprint時などの改行は どうなるか分かりません。 JavaTM Platform Standard Ed. 6 https://docs.oracle.com/javase/jp/6/api/java/util/regex/Pattern.html >\n 改行文字 ('\u000A') >\r キャリッジリターン文字 ('\u000D')

回答No.7

>回答No.6 amanojaku1 scanner.useDelimiter(",|\r\n|\n|\r"); ↑ここで改行を直に扱っています。

回答No.6

データの個数を4個に限定した場合の処理。 カンマ「,」、Enterの どちらでも複数のデータを入力できます。 import java.util.Arrays; import java.util.Scanner; //クラス名は自分のプログラムのクラス名に変更して下さい。 public class test { public static void main(String[] args) { int iDataQuantity = 4; Scanner scanner = new Scanner(System.in); scanner.useDelimiter(",|\r\n|\n|\r"); /* プログラマーが改行を直に扱う場合には注意が必要です。 Javaの改行の実装は どうなっているのか知りませんが、下記は改行のスタンダードな実装です。 # 【エスケープ文字のコード】 #    # Windows  # UNIX  # Mac  # # "\n" # \x0A   # \x0A  # \x0D  # # "\r" # \x0D   # \x0D  # \x0A  # # 【print時など】 #    # Windows  # UNIX  # Mac  # #改行(\n)# \x0D\x0A # \x0A  # \x0D  # # "\r" # \x0D   # \x0D  # \x0A  # */ int[] array = new int[iDataQuantity]; for( int i = 0; i<iDataQuantity; i++){ array[i] = scanner.nextInt(); System.out.println("main( ):" + "i=" + i + "; " + "array[i]=" + array[i] + "; " + ""); } Arrays.sort(array); System.out.println("sort"); for( int i = 0; i<array.length; i++){ System.out.print(array[i] + ", "); } } }

関連するQ&A

  • Javaで先頭の0を含め整数の桁数を取得したい

    Javaで整数の桁数を取得したいのですが、 Scanner ids = new Scanner(System.in); int i = ids.nextInt(); String s = String.valueOf(i); int keta = s.length(); こうした場合に 12345678 と入力すれば8が取得できるのですが、 09876543 と入力したときに7と取得してしまいます。 先頭の0を無視せずに取得するにはどうすればよいでしょうか。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • javaのfor文

    nの値の和を求めるのはこれ以外に書き方はありますか? import java.util.*; class SampleGoo{ public static void main(String args[]){ Scanner std = new Scanner(System.in); System.out.print("整数値:");int n = std.nextInt(); int ans = 0; for (int i = 1;i <= n;i++){ ans = ans + i; } System.out.println(Integer.toString(ans)); } }

  • javaのfor文

    nの値の和を求めるのはこれ以外に書き方はありますか? import java.util.*; class SampleGoo{ public static void main(String args[]){ Scanner std = new Scanner(System.in); System.out.print(\"整数値:\");int n = std.nextInt(); int ans = 0; for (int i = 1;i <= n;i++){ ans = ans + i; } System.out.println(Integer.toString(ans)); } }

  • 教科書に載っていた、Javaのプログラムなのですがなぜかコンパイルでき

    教科書に載っていた、Javaのプログラムなのですがなぜかコンパイルできません。 import java.until.Scanner; class ScanInteger{ public static void main(String[] args){ Scanner scan = new Scanner(System.in); System.out.print("整数値:"); int x = scan.nextInt(); System.out.println(x + "と入力しましたね。"); } } エラーの内容としては、ScannerクラスのSに何か原因があると言うようなものが出ます。 よろしくお願いします。

  • Javaで配列のソートを行ったとき、その要素を得る

    こんにちは Javaで、 int[] arr=new int[]{3,1,5,4,6,2}; Arrays.sort(arr); で、一発で、大きさ順になるようですが、 このとき、大きさの番号順を得た得たいのですが int[] arr2=new int [7]; でarr2[1]=2;arr2[2]=6;arr2[3]=1;////という結果が得たいのですがそうするのでしょうか?

  • javaのプログラム

    int型の配列の各要素に1~10の乱数を代入し、各要素の値を縦向きの*のグラフで表示するプログラムを作っているのですが、結果がランダムででるので、自分の書いたプログラムが正しいのかわかりません。ソースを載せますので合っているのか間違っているか教えて下さい。もし間違っているならどこが間違いなのか教えていただけると嬉しいです。よろしくお願いします。 ●ソース import java.util.Random; import java.util.Scanner; class Graph { public static void main(String[] args){ Random rand = new Random(); Scanner stdIn = new Scanner(System.in); System.out.print("要素数:"); int n = stdIn.nextInt(); int a[] = new int[n]; for (int i = 0; i < n; i++) a[i] = 1 + rand.nextInt(10); for (int i = 1; i <= 10; i++){ for (int j = 0; j < n; j++) if (a[j] <= i) System.out.print("* "); else System.out.print(" "); System.out.println(); } } } ●実行例 要素数:12 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

    • ベストアンサー
    • Java
  • javaプログラミングについて!

    ただいまjavaプログラミングの勉強をしております。 そこで数字を複数回入力させ、-1を入力すると終了し、その数字の最大、最小、平均を出力するプログラムを作っているのですが、 public static void main(String[] args) { int max = 0; int min = 100; int sum = 0; int count = 0; Scanner sc = new Scanner(System.in); System.out.println("正の整数を入力してください"); int n = sc.nextInt(); while (num01 != -1){ System.out.println("正の整数を入力してください"); sum += n; n = sc.nextInt(); count++; if(max < n) max = n; if(min > n) min = n; } System.out.println("入力された整数の最大は" + max); System.out.println("入力された整数の最小は" + min); System.out.println("入力された整数の平均は" + sum/count); } } このようなプログラミングが作れたのですが、たとえば30と10を入力したときに 最大10 最小-1 平均20 と表示されてしまいます。色々試行錯誤してみたのですが、改善されなかったため質問させて頂きました。原因と解決方法を教えて頂きたいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • JAVAで配列を使って * を縦向きのグラフで表示したいです。

    JAVAの勉強をしています。 このプログラムは配列に乱数を生成して * を 横向きにするプログラムです。 練習問題で、以下のプログラムを書き換えて、* を縦向きのグラフで表示する問題なのですが、解く方法がわかりません。 どなたか答えもしくはヒントを下さい。 よろしくお願いします。 import java.util.Random; import java.util.Scanner; public class Test06_04 { public static void main (String[] args) { Random rand = new Random(); Scanner stdIn = new Scanner(System.in); System.out.print("要素数 : "); int n = stdIn.nextInt(); //要素数を読み込む int[] a = new int[n]; //配列を生成 for (int i = 0; i < n; i++) { a[i] = 1+ rand.nextInt(10); } for (int i = 0; i < n; i++) { System.out.print("a[" + i + "] : "); for (int j = 0; j < a[i]; j++) System.out.print('*'); System.out.println(); } } }

    • ベストアンサー
    • Java
  • JAVAの演習問題

    現在JAVAを独学中なのですが、以下の演習問題でつまずいております。 (解答がない演習問題なので、このサイトにて質問することにしました。) 実行例 1からnまでの和を求めます。 nの値:5 1から5までの和は15です。 (5はキーボードにて入力された値。15はその結果の値。) 自分の解答は以下になるのですが、実行例のようになりません。 ご解答頂けると大変助かります。 import java.util.Scanner; class Ensyuu413 { public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); System.out.println("1からnまでの和を求めます。"); System.out.print("nの値:"); int n = stdIn.nextInt(); for ( int i = 0, j = 0; i <= n; i++, j += i) System.out.println("1から"+n+"までの和は"+j+"です。"); } }

  • java enum

    エラー内容 int cannot be dereferenced 何が原因でエラーになっているのですか? import java.util.*; enum light{ red,yellow,blue } class m1{ public static void main(String[] args){ int light; Scanner ss = new Scanner(System.in); System.out.println("整数値を入力 : "); int i = ss.nextInt(); if(i == light.red.ordinal()){ System.out.println("信号は赤色です"); } else if(i == light.yellow.ordinal()){ System.out.println("信号は黄色です"); } else if(i == light.blue.ordinal()){ System.out.println("信号は青色です"); } } }

専門家に質問してみよう