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

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

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

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

Q&A

解決済

2回答

1096閲覧

配列を昇順、降順にする処理を作ったが、うまく出力されない。

tamachin

総合スコア2

Java

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

0グッド

0クリップ

投稿2021/10/08 05:25

編集2021/10/08 05:37

前提・実現したいこと

3つのメソッドを使って配列を昇順、降順にする処理を作成したい。

発生している問題・エラーメッセージ

昇順、降順にしたものが出力できない。 (出力のやり方がわからない。)

該当のソースコード

Java ソースコード package sample; public class Kadai5_7 { public static void main(String[] args) { //配列データの宣言・初期化 int[] arrays1 = { 96, 45, 31, 29, 84, 77 }; //並び替え前の配列内を表示 display(arrays1, false); //昇順で並び替えを実施 arraysSort(arrays1, true); //並び替え後の配列内を表示 display(arrays1, true); //降順で並び替えを実施 arraysSort(arrays1, false); //並び替え後の配列内を表示 display(arrays1, true); } public static void arraysSort(int[] array, boolean orderType) { if (orderType == true) { for (int i = 0; i < array.length; i++) { for (int j = i; j <array.length; j++) { if (array[i] < array[j]) { change(array, i, j); } } } } else { for (int i = 0; i < array.length; i++) { for (int j = i; j <array.length; j++) { if (array[i] > array[j]) { change(array, i, j); } } } } } public static void display(int[] array, boolean isSorted) { if (isSorted == true) { System.out.println("****並び替え後****"); } else { System.out.println("****並び替え前****"); for (int i = 0; i < array.length ; i++) { System.out.print(array[i] + ","); } } } public static void change(int[] array, int i, int j) { int [] tmp = new int [array.length]; tmp[i] = array[i]; tmp[j] = array[j]; array[i] = tmp[i]; array[j] = tmp[j]; } }

試したこと

public static void display関数の中で出力処理を考えたが、うまくいかなかった。

補足情報(FW/ツールのバージョンなど)

eclipse

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

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

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

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

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

BeatStar

2021/10/08 10:14

『うまくいかない』というのはやめましょう。そういうのは『主観』でしかないです。 今回はコードから予想が付きますが、基本的には予想が出来ない事が多いです。 ファイルの文字コードが違う、ディレクトリ(フォルダ)が無い、パスが間違っている…… いろんな可能性があります。 「だったら聞けばいいだろ」と思いますか? 回答者は質問者ではありません。 なので逐一聞かないとわかりません。ですが、回答者はPCやケータイに張り付いているわけではありません。 よって、ちゃんと書くべきです。
tamachin

2021/10/11 02:02

承知いたしました。 ただ並び替えた後の出力方法がいまいちわかりません。 そのままfor文で回しても並び替えた前しか出力されないのですがどうすればいいでしょうか
BeatStar

2021/10/11 02:36 編集

いや、私の回答読んだ? ちゃんと読めばわかるはずだが… 『うざいから読んでない』とかで無い限り、読めば対策が立てられるはずです。 (以下削除)
BeatStar

2021/10/11 02:28

ちなみに質問者さんを馬と鹿にするつもりは全くありません。あしからず。
tamachin

2021/10/12 02:35

承知しました。 後ほど熟読いたします
guest

回答2

0

ベストアンサー

まず、前提自体が間違っています。
プログラミングっていうのは「こう書けばいい」……ではありません
やみくもに書けばいいってものではありません。

プログラミングは現実世界のシミュレーションです。

次に、コードを読みましょう

コードを読むコツは『一行レベルで、その行が何をしているかを考えながら読む』です。

まず、mainメソッドを見ます。

public static void main(String[] args) { //配列データの宣言・初期化 int[] arrays1 = { 96, 45, 31, 29, 84, 77 }; //並び替え前の配列内を表示 display(arrays1, false); //昇順で並び替えを実施 arraysSort(arrays1, true); //並び替え後の配列内を表示 display(arrays1, true); //降順で並び替えを実施 arraysSort(arrays1, false); //並び替え後の配列内を表示 display(arrays1, true); }

ここまではいいですね。
次に、問題の表示をしているであろうメソッド、displayメソッドも読みます。
それとインデントは揃えましょう。
初見では、if( isSorted == true ) ... の部分と else ... の部分のインデント数が違うので、
入れ子かなと勘違いしやすいです。(読めばわかるが、初見だとね…)

Java

1 public static void display(int[] array, boolean isSorted) { 2 // ソート済みなら 3 if (isSorted == true) { 4 // 『並び替え後』と表示 5 System.out.println("****並び替え後****"); 6 // それ以外( isSorted が trueではない ) 場合 7 } else { // <- ここのインデントを変えましょう 8 // 『並び替え前』と表示 9 System.out.println("****並び替え前****"); 10 // 変数iの初期値: 0, iがarrayの要素数未満である間, +1しながらループ 11 for (int i = 0; i < array.length ; i++) { 12 // 出力 13 System.out.print(array[i] + ","); 14 } 15 } 16 }

"<- ここのインデントを変えましょう" の部分以外のコメントを、疑似コードとして抜き出してみましょう。

1. ソート済みなら 1.1. 『並び替え後』と表示 2. それ以外(ソート済みでない)なら 2.1. 『並び替え前』と表示 2.2. 変数iの初期値: 0, iがarrayの要素数未満である間, 以下をループ 2.2.1. 出力 3. 処理終了

これを料理のレシピなり数学の途中式なりのなんらかの手順として、現実世界でシミュレーションしてみてください。
実際に引数 sorted とかにデータを入れてみるとかで。

そうするとおかしいことに気づきませんか?

ソート済みでない、つまりisSorted: false の場合は(1)を満たさないので、(1.1)は行われず、
(2)に行く。
で、(2)では条件に関係なく上記if文を満たしていない場合は常に行われるので、(2.1)等が処理される。

でも、ソート済み、つまり isSorted: true の場合は、(1)を満たします。

なので(1.1)を処理します。

すると、(2)はスキップされます。( (2)は(1)が満たされない場合のみなので )

それによって (3) に行きます。

よって、『並び替え後』とだけしか出力されません。

ではどうすればいいか。

単純に考えれば、(1.1)の直後、つまり(1.2)に相当するような場所で(2.2)~(2.2.1)のような処理をすればいいですね。

現実世界で考えるとわかるはずです。

でも、そうすると、

1. ソート済みなら 1.1. 『並び替え後』と表示 1.2. 変数iの初期値: 0, iがarrayの要素数未満である間, 以下をループ 1.2.1. 出力 2. それ以外(ソート済みでない)なら 2.1. 『並び替え前』と表示 2.2. 変数iの初期値: 0, iがarrayの要素数未満である間, 以下をループ 2.2.1. 出力 3. 処理終了

となります。

まあ、これでも動く事は動きますが、無駄が多いです。
もしこの(1.2)等に相当する部分が100行に及ぶような処理だとどうなるでしょうか。

仮に行数は今回と同等でも、アルゴリズム等が変わるか、『iがarrayの要素数未満である間』とかのような条件が変更されたと考えるとどうでしょうか。

毎回書き換えないといけません。

ではどうするか。メソッド化してもいいですが、今回はちょっと別の視点で考えてみましょう。

(1)の場合も(2)の場合も、

一. 『並び替え前』or 『並び替え後』 二. 配列にある分出力

という流れは同じで、出力する内容もほぼ同じですね。

なので、(一) だけをif文の対象範囲としてif...else...とかで分岐させ、
(二)ではどのみち出力するのでそのまま。

つまり、疑似コードだと、

1. ソート済みなら 1.1. 『並び替え後』と表示 2. それ以外(ソート済みでない)なら 2.1. 『並び替え前』と表示 3. 変数iの初期値: 0, iがarrayの要素数未満である間, 以下をループ 3.1. 出力 4. 処理終了

のようにすればどうでしょうか。

まあ、この場合でも(3)~(3.1)のアルゴリズムが変わるとどうしようもないですが。
それでも、最初よりはすっきりとするはずです。

このように『共通項』や『規則性』を見付けるといいですよ。

投稿2021/10/08 08:25

BeatStar

総合スコア4958

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

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

0

表示されないのは、displayメソッドに原因があります。
配列の中身を表示する処理は、第2引数をfalseにしないと表示されません

java

1 public static void display(int[] array, boolean isSorted) { 2 if (isSorted == true) { 3 System.out.println("****並び替え後****"); 4 } else { 5 System.out.println("****並び替え前****"); 6 for (int i = 0; i < array.length ; i++) { 7 System.out.print(array[i] + ","); 8 } 9 } 10 }

そのため、以下のように第2引数をtrueが表示されません。

java

1//昇順で並び替えを実施 2arraysSort(arrays1, true); 3//並び替え後の配列内を表示 4display(arrays1, true); 5

投稿2021/10/08 05:40

naochan1214

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問