@ortyyy (Kawaki Ruida)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

java 降順 ソート 【初心者】

解決したいこと

以下のコードでうまく降順で表示させるようにしたいです。
その際、for文の中身は変えないようにしたいです。
ネットで紹介されているものはだいたい加算か減算で、除算で降順をしているものはあまりなかったため、てこずっています、、、

発生している問題・エラー

import java.util.Arrays;

public class Main {
    public static void main(String[] args){
        int height[] = {170, 140, 150, 190, 130, 200, 180};
        int i, j, tmp;
    //もとの配列をそのまま表示
        for(i = 0; i < height.length; i++){
            System.out.print(height[i] + " ");
        }
        System.out.print("\n");
    //配列のソート(昇順)
        Arrays.sort(height);
    //配列のソート(降順)
        j = height.length-1;
        for(i = 0; i < height.length/2; i++){
            tmp = height[i];
            height[i] = height[j]; //ここを変えてうまく降順にしたい
            height[j] = tmp; 
        }
    //ソート後の配列を表示
        for(i = 0; i < height.length; i++){
            System.out.print(height[i] + " ");
        }
        System.out.println("\n");
    }
}

出力結果

170 140 150 190 130 200 180 
200 130 140 170 180 190 150 

これを

170 140 150 190 130 200 180 

200 190 180 170 150 140 130

と表示されるようにしたいです。その際、

for(i = 0; i < height.length/2; i++){

ここは変えずに

height[i] = height[j]; //ここを変えてうまく降順にしたい
height[j]//ここを変えてうまく降順にしたい = tmp; 

ここのjの部分を変えて降順にしたいです。

該当するソースコード

java

困っていること

i < height.length/2;

ここでやっていることがいまいちよくわからず、手こずってしまっています、、、

0 likes

2Answer

元々のコードを変えない形で実現させると例えば以下の感じになるでしょうか。
j--; // 追加
を追加したのみです。

import java.util.Arrays;

public class Main {
    public static void main(String[] args){
        int height[] = {170, 140, 150, 190, 130, 200, 180};
        int i, j, tmp;
        
        //もとの配列をそのまま表示
        for(i = 0; i < height.length; i++){
            System.out.print(height[i] + " ");
        }
        System.out.print("\n");

        //配列のソート(昇順)
        Arrays.sort(height);

        //配列のソート(降順)
        j = height.length-1;
        for(i = 0; i < height.length/2; i++){
            tmp = height[i];
            height[i] = height[j]; //ここを変えてうまく降順にしたい
            height[j] = tmp;
            j--;  // 追加
        }
        
        //ソート後の配列を表示
        for(i = 0; i < height.length; i++){
            System.out.print(height[i] + " ");
        }
        System.out.println("\n");
    }
}
実行結果
$ java Main 
170 140 150 190 130 200 180 
200 190 180 170 150 140 130

このfor文でやりたい事は、
for(i = 0; i < height.length/2; i++){

以下のように配列の中心(height.length/2)を基準に大きい値と小さい値を入れ替えることだと思います。
(赤字が入れ替え箇所)

130 140 150 170 180 190 200 // 配列(昇順)
200 140 150 170 180 190 130 // for文1loop目
200 190 150 170 180 140 130 // for文2loop目
200 190 180 170 150 140 130 // for文3loop目

0Like

Comments

  1. @ortyyy

    Questioner

    ご回答ありがとうございます。こちら、height[i] = height[j]の右辺の中身を変えるとするならばどのような形になりますでしょうか。

こちら、height[i] = height[j]の右辺の中身を変えるとするならばどのような形になりますでしょうか。

例えば以下のようになるでしょうか。height[j]height[j-i]にしています。

        //配列のソート(降順)
        j = height.length-1;
        for(i = 0; i < height.length/2; i++){
            tmp = height[i];
            height[i] = height[j-i]; //ここを変えてうまく降順にしたい
            height[j-i] = tmp; // ここも修正
        }

ただし、
height[j-i] = tmp;
の部分も修正しています。
おそらく、height[i] = height[j]の右辺の中身だけ変えて降順にするのは難しいのでは?と思いました。

0Like

Comments

  1. @ortyyy

    Questioner

    ありがとうございます!下のものも変えてしまって大丈夫です!
    ですがj-1だと
    170 140 150 190 130 200 180
    190 130 140 170 180 150 200
    それだとこのようになってしまうのですが、、、
  2. j-1ではなくて、j-iです。
    見づらかったですね・・
  3. @ortyyy

    Questioner

    すみません、いけました!ありがとうございます!!

Your answer might help someone💌