質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

4回答

1106閲覧

コマンドライン因数で引き出した数字を昇順に並べたい

nakagen

総合スコア24

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2020/08/07 14:39

下のプログラムでは、コマンドライン因数で引き出した数字を昇順に並べ替える目的で作りました。

package kadai; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; class a { public static void main(String[]args){ if(args.length != 1){ System.out.println("ファイル名を正しく指定してください。"); System.exit(1); } try { BufferedReader br = new BufferedReader(new FileReader(args[0])); String str; while((str = br.readLine())!= null) { double[] test = new double[10]; for(int i = 0;i<test.length;i++) { test[i] = Double.parseDouble(str); } for(int s=0; s<test.length-1; s++) { for(int t=s+1; t<test.length; t++) { if(test[t] < test[s]) { double tmp = test[t]; test[t] = test[s]; test[s] = tmp; } } } for(int j=0; j<1; j++) { System.out.println(test[j]); } } br.close(); } catch(IOException e){ System.out.println("入出力エラーです。"); } } }

しかし、コマンドライン因数でファイルを読み込むところまでは行けましたが、数字が入れ替わりません。

どうすれば、数字を入れ替えることが出来るようになりますでしょうか?

なお、実行結果では、ファイルの中の数字がそのまま並べてある(ファイルの中の数字は、改行を使いましたが・・・)だけです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/08/07 16:46

> コマンドライン因数 おそらく「引数(ひきすう)」を「いんすう」と読み間違えた上で、さらに変換ミスですね。
guest

回答4

0

ファイルの内容が仮に、
3.14
1.732
2.236
であったとして、実行をトレースしてみましょう。

str = br.readLine() で、str = "3.14" になります。
次の for文で、test[0] = 3.14, test[1] = 3.14 ... test[9] = 3.14 となります。
その次の for の二重ループで test を昇順にソートします。
次の for (int j=0; j<1; j++) { System.out.println(test[j]); で
test[0] だけを表示し、3.14 が表示されます。
while文の最後に達したので、while文の先頭に戻り str = br.readLine() を実行します。
同様にして、1.7232 が表示されます。
次に 2.236 が表示されます。
その次は、str = null なので、whileループを抜けます。

何が悪いか分かりますよね。

すべての行の読み込みが完了してからソートしましょう。

Java

1package kadai; 2 3import java.io.BufferedReader; 4import java.io.FileReader; 5import java.io.IOException; 6 7class a { 8 public static void main(String[] args) { 9 if (args.length != 1) { 10 System.out.println("ファイル名を正しく指定してください。"); 11 System.exit(1); 12 } 13 try { 14 BufferedReader br = new BufferedReader(new FileReader(args[0])); 15 Double[] test = new Double[10]; 16 int n = 0; 17 for (; n < test.length; n++) { 18 String str = br.readLine(); 19 if (str == null) break; 20 test[n] = Double.parseDouble(str); 21 } 22 br.close(); 23 24 for (int s = 0; s < n - 1; s++) { 25 for (int t = s + 1; t < n; t++) { 26 if (test[t] < test[s]) { 27 double tmp = test[t]; 28 test[t] = test[s]; 29 test[s] = tmp; 30 } 31 } 32 } 33 for (int j = 0; j < n; j++) { 34 System.out.println(test[j]); 35 } 36 } 37 catch (IOException e) { 38 System.out.println("入出力エラーです。"); 39 } 40 } 41}

投稿2020/08/08 02:50

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

読み取るファイルに、1行に1つの倍精度浮動小数点数が書いてあるとして、まず読み込みを思った通り実行しないと、並び替え以前にまともに処理できませんね。

ファイルに何行あるかわからない場合、一番単純なのは List<Double> 型の変数に ArrayList<Double> のインスタンスを設定してそこに読み取った文字列を Double に変換して add していきましょう。
まず、その部分だけやってしまってから、 ArrayList<Double> 変数の中身をそーとするように考えてはどうですか?

・・・ // まずファイルから読み込みきる // 補足:ここは可能であれば try-with-resource で書く方が良い(けど割愛) BufferedReader br = new BufferedReader(new FileReader(args[0])); List<Double> test = new ArrayList<>(); String str; while((str = br.readLine())!= null) { test.add(Double.valueOF(str)); } br.close(); // 次に並べ替える ・・・ // 並べ替えた結果を出力してみる ・・・

今時なので Java SE のバージョンは 8 より古いということはないですよね。
8 もしくはそれよりも新しい Java SE であれば、上のように ArrayList に入れてしまったら、 stream API 使ったり、 8 より少々古くても、(バージョン 1.2 からありそうな)java.util.Collectionssort メソッドを使えば、ご自身で並べ替えのロジック組まずとも並べ替えられると思います。(学校の課題とかで制限されているとそうもいかんでしょうけど)

最後に、他の回答者の方も助言されていますが、ご自身がやろうとしていることをコメントで書いて、段取りを考えつつ、部分的な内容を整理しながらコーディングされると良いでしょう。(疑似コーディングという考え方もあります)
プログラムの構造が理解しやすくなると思いますよ。

投稿2020/08/07 17:03

ironya

総合スコア454

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

とりあえず、細部のコードがどうこうという話ではなく、全体の構成がおかしいと思うので、
まずは、自分のやりたいこと、その手順を大きな枠で文にして書いてみるところから
はじめるのがいいと思う。

コマンドライン因数で引き出した数字を昇順に並べ替える

というのを、もう少し具体的内容にして、要素ごとに分解して、手順の通りに箇条書きにして並べる
それがうまくできれば、一気に進むと思います。

もしくは、今のコードを一塊ずつ、意味に置き換えてみるのでも、構成の間違いに気づくのには有効です。

しいて言うなら

ファイルを読み込むところまでは行けましたが、

ファイルを読み込むところができていません。
今の状態だと、1行単位でしか読めない上に、毎回、1行読むたびに、前に読んだデータを全て捨てているので、並び替えを行う以前の状態になっています。
今の方法で並び替えをするためには初めから全てのデータがそろっている必要があります。
なので、

ファイル全部読み込む

データを並び替える

という順にする必要があります。

投稿2020/08/07 15:07

編集2020/08/07 16:28
amiya

総合スコア1218

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakagen

2020/08/07 15:10

なるほど、、、どのような所を見て、全体の構造がおかしいと思ったのでしょうか・・・?
amiya

2020/08/07 15:18

書かれているコードを意味に置き換えて日本語で読むとわかります。 A-B-C-Dという手順を踏んでやるところを、 AをやりかけのままにBに手を出したり、途中で前の成果を投げ捨てて破壊してたりと 流れがめちゃくちゃになってるので… なので、試しにやってることに、その部分では何をやっているのかコメントを付けてみるだけでも してみると良いです。
guest

0

for(int i = 0;i<test.length;i++) {

test[i] = Double.parseDouble(str); }

strの値でtestを埋めてるだけですね(全て同一値)

投稿2020/08/07 14:43

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakagen

2020/08/07 14:47

ここで言う同一値とは、どういう意味でしょうか?教えて頂けるとありがたいです・・・
y_waiwai

2020/08/07 14:49

このループ中では、strのナカミは変更されてません strが”1”であれば、testはすべて1となります
nakagen

2020/08/07 14:55

つまり、ファイルを10個作るということか、strをループさせるかということでしょうか・・・?
y_waiwai

2020/08/07 15:00

str = br.readLine() をforの中に入れればいいかとおもいます Eclipseなら、1行づつ実行させて、どういう順番にどう実行されるのか見ていけば理解できると思います
nakagen

2020/08/07 15:06

一度やってみたのですが、whileとdoubleの中のstrが機能しなくなりました・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問