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

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

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

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

Q&A

解決済

5回答

13026閲覧

2番目の最大値の求め方

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2016/02/02 00:14

javaを学習し始めで不明な個所がありますので、質問させていただきます。

4つの数値があり、それぞれを比較し2番目の最大値を取得するプログラムを作成したいと思っています。同じ最大値が複数ある場合は、その中での最大値から2番目(7,7,5,2)と入力された場合、「5」が出力されるプログラム

今、以下のようなものを作成しました。(可読性など考えるとよくない部分はあると思いますが…)
これを実行すると、すべての中の2番目(上記の場合、「7」となり同じ値が複数ある場合の結果と異なってしまいました。

どの辺を変えればよいかわかる方いましたらご教授お願いしたいと思います。


class TestSrc02 {

public static void main (String[] args) { System.out.println("{0,1,2,3}で2番目に大きい値は = " + theSecond(0,1,2,3)); System.out.println("{2,-1,7,2}で2番目に大きい値は = " + theSecond(2,-1,7,2)); System.out.println("{5,5,5,5}で2番目に大きい値は = " + theSecond(5,5,5,5)); System.out.println("{3,9,2,6}で2番目に大きい値は = " + theSecond(3,9,2,6)); System.out.println("{9,8,0,4}で2番目に大きい値は = " + theSecond(9,8,0,4)); } public int theSecond (int a, int b, int c, int d) { int seiretsu[] = new int[4]; int max1 = max(a, b); int max2 = max(c, d); int min1 = min(a, b); int min2 = min(c, d); seiretsu[3] = max(max1, max2); if (max1 <= max2) { seiretsu[2] = max(max1, min2); } else { seiretsu[2] = max(min1, max2); } return seiretsu[2]; } private int max(int x, int y){ if (x < y) { return y; } else { return x; } } private int min(int x, int y){ if (x > y) { return y; } else { return x; } }

}
-----------------------------------------------///

また、staticについてもtheSecondメソッドではつけないようにすることとありましたが、外すとコンパイルエラーとなってしまうためどのようにすべきかご教授いただければと思います。

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

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

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

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

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

shanxia

2016/02/02 00:40

(7,7,5,2)と入力された場合、「5」が出力されるならば、(5,5,5,5)と入力された場合は、何を出力するのでしょうか?
退会済みユーザー

退会済みユーザー

2016/02/02 00:50

すべて同じ値が入力された場合はその値(5,5,5,5)の場合は「5」となります。
Alice0225

2016/02/02 02:03

例にはありませんが、(5,5,5,2)の場合は"2"を出力ですか?
guest

回答5

0

ベストアンサー

theSecondメソッドの処理で、このアルゴリズムなら配列不要・・・というのは置いときまして・・
7,7,5,2 が与えられたときに、どのように処理されるかを考察しましょう。

このアルゴリズムでは、先ずは次の2グループに分けていますね。
それぞれ、仮にAグループ、Bグループと名付けます。

Aグループ(7,7) Bグループ(5,2)

次に、各グループから最大値と最小値を選出します。

(AグループMax 7 AグループMin 7)
(BグループMax 5 BグループMin 2)

それぞれの最大値を比較して、一番大きいのは AグループのMaxである、7。
これが与えられた4つの数値の中で最大で、ここは良いです。
(なぜ配列の添え字3に代入しているか・・・は置いておきます)

2番目の候補となるのは、BグループのMaxか、あるいは AグループのMinとなるため、これを比較
し、AグループのMinである7が採用されます。
"整列されたデータの2番目" という意味ではあってますが、これを返却してしまっているため、題意に則しません。

「2番目として採用された値が、1番目と同値だった場合」というケースが抜けているんですね。

このまま、このケースを考慮した条件分岐を行ってプログラムをしても、やがては目的に沿う処理になるでしょう。
でも、ちょっと視点を変えると、考えやすくなりますよ。

与えられた数値の組(この場合は4つ)の最大を求めることができるのですから、
今度はこの最大値を省いた数値の組をつくってしまえば・・・

ちなみに、static 修飾子を付けない場合、クラスをインスタンスしなければメソッドはつかえません。

このケースで言えば、

Java

1TestSrc02 testSrc02 = new TestSrc02(); 2int theSecondNumber = testSrc02.theSecond(7,7,5,2);

です。

投稿2016/02/02 01:03

Toyoshima

総合スコア422

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

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

0

入力値の重複を取り除く処理 入力値をキーと値に持つハッシュマップを作る。

完成したハッシュマップからvalue の型の配列を取得する。Map.toArray(new Integer[map.size()]

降順ソートし先頭の1件を読み飛ばす。

配列の現在の要素を返却する。

java

1public class Second { 2 public Second(int ...args) { 3 map = new HashMap<Integer, Integer>(); 4 for (int kv : args) map.put(kv, kv); 5 Integer[] array = new Integer[map.size()]; 6 array = map.toArray(array); 7 Collections.sort(array, new Comparator<Integet>() { 8 @Override 9 public int compare(Integer a, Integer b) { return b - a; } 10 }); 11 if (array.length > 1) { 12 retVal = array[1]; 13 } else { 14 retVal = -1; // error 処理するか? 15 } 16 } 17 public int getVal() { return retVal; } 18 private int retVal; 19} 20 21上記だと、integer 固定なので、Second<T> として、ジェネリックタイプでやればいい感じです。 22compare メソッドで型が曖昧になるので、? extends Number を忘れずに。 23 24 25------ 26追記 27無理に generics にする必要ないですね。 28イマイチ感アリアリですが、重複排除、降順ソートは java8 stream で、以下のようになります。 29Object[] arrays = map.keySet().stream().distinct().sorted((a,b) -> { return (int)(b.doubleValue() - a.doubleValue()) }).toArray(); 30

投稿2016/02/02 01:55

編集2016/02/02 02:26
ipadcaron

総合スコア1693

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

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

0

java

1if (max1 < max2) { 2 seiretsu[2] = max(max1, min2); 3} else if (max1 > max2) { 4 seiretsu[2] = max(min1, max2); 5} else { 6 seiretsu[2] = max(min1, min2); 7}

これでどうでしょう?
max1がmax2より大きい場合、残りのパターンは次の8通り?
max2 > min1 > min2 (4,2,3,1)等
max2 > min2 > min1 (4,1,3,2)等
max2 > min1 = min2 (4,1,3,1)等
max2 = min1 > min2 (4,3,3,1)等
max2 = min2 > min1 (4,1,3,3)等
max2 = min1 = min2 (4,3,3,3)等
min1 > max2 > min2 (4,3,2,1)等
min1 > max2 = min2 (4,3,2,2)等
いずれの場合もmax(min1, max2)の結果で問題なさそうに思います。
max2がmax1より大きい場合も同様にmax(max1, min2)で問題なさそう。
max1とmax2が同値の場合だけ、2番目の値はmin1,min2の何れかになります。

投稿2016/02/02 01:19

編集2016/02/02 01:43
hirohiro

総合スコア2068

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

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

0

staticメソッドやstaticフィールドは、インスタンスに紐付かず、そのクラスで共有するものを扱います。そのため、クラス名からアクセスできます。そのクラス自体からアクセスするのならメソッド名だけでアクセスできることになります。
staticを外すとその特徴がなくなり、インスタンス経由でないとアクセスできません。staticを外したtheSecondメソッドを使うのなら、このクラスのインスタンスを作成する必要があります。

java

1public static void main (String[] args) { 2 TestSrc02 test = new TestSrc(); //インスタンスの生成 3 //インスタンスのメソッドを使う 4 System.out.println("{0,1,2,3}で2番目に大きい値は = " + test.theSecond(0,1,2,3)); 5}

メソッドの方針としては、まず与えられた4つの数字を大きい方から順に並べておいて、その最大値を記憶しておき、並べた値を大きい方からその最大値と比較していきます。そうして最初に最大値と違う値が見つかった時、それが「2番目に大きい数」になります。最後まで見つからなかった場合はずべて同じ数の場合なので、最初に記憶しておいた最大値を結果として返せばいいことになります。

投稿2016/02/02 01:05

swordone

総合スコア20651

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

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

0

解決済みになっていますが、プログラムについて
①バブルソートで大きい順に並び変え
②判定

Java

1int a[] = {8,8,2,8}; 2 3//① 4for(int i=0; i<3; i++){ 5 for(int j=0; j<3-i; j++){ 6 if(a[j]<a[j+1]){ 7 int temp=a[j]; 8 a[j]=a[j+1]; 9 a[j+1]=temp; 10 } 11 } 12} 13 14//② 15if (a[0]>a[1]){ 16 System.out.print(a[1]); 17}else if(a[1]==a[2]){ 18 System.out.print(a[3]); 19}else{ 20 System.out.print(a[2]); 21}

でどうでしょう?

投稿2016/02/02 01:00

編集2016/02/02 02:16
Alice0225

総合スコア206

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問