プロが教えるわが家の防犯対策術!

Java初心者です。
Javaで「n番目に大きい値を探索」するプログラムを組みたいのですが、お力を貸してください!

配列データ(10)には各要素に1~10の値が入っています。
ただし配列データをランダムで数値を入れた場合でも動くこと。
ランダムで決めたn番目の値を探索するプログラムです。

----

int[] data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
//配列データの順番はランダムに並び替わります

int n = random.nextInt(data.length) + 1;

for(int range = 0; range < n; range ++) {

//n番目の要素が見つからなかった場合
if(n > data.length) {
System.out.print(n + "番目に大きい要素は見つかりませんでした。");
break;
}

/* 範囲の先頭から最後まで処理を繰り返し、範囲内の最小値が格納
* されている要素を決定する
*/
for(int seach = range + 1; seach < data.length; seach ++) {
//基準値より探索値が小さかった場合
if(data[range] <= data[seach]) {

int swa = data[range];
data[range] = data[seach];
data[seach] = swa;
}
}

//n番目の要素が見つかった場合
if(n -1 == range) {

System.out.print(n + "番目に大きい要素は" + data[range] + "です。");
break;
}
}

----

と言う感じで一度組んでみたのですが、
配列に格納されている値を変更しないようにと言われました。

まず一番大きな値を探し、その値より小さい値を順に探索していけばいいのだと思うのですが、いまいち分かりません。
誰か教えてください。よろしくお願いします。

A 回答 (7件)

難しく考えすぎじゃないですか? 質問者さんが仰るとおり「まず一番大きな値を探し、その値より小さい値を順に探索していけばいい」のだと私も思います(^^;。


「配列の中から最大値を探索する」線形探索問題の次の課題だと思いますが、単純な応用問題ですよ。
「配列の中から最大値を探索する」場合、仮の最大値と配列の要素を比較しますが、そこに、「一番大きな値より小さい」という条件を追加するだけです。
「配列の中からn番目に大きな値を探索する」ときは、この判定条件が「n-1番目に大きな値より小さい」と変化するだけです。

上限値 = 0
for(n回繰り返し)
 仮の最大値 = 0
 for(配列要素数繰り返し)
  if(配列の要素 > 仮の最大値)
   if(上限値 == 0)
    仮の最大値 = 配列の要素
   else if(配列の要素 < 上限値)
    仮の最大値 = 配列の要素
 上限値 = 仮の最大値

こんな感じ(^^;)
    • good
    • 0

Collections.shuffle(list);



ここでシャッフルしてますよ。
何度か実行して実行結果の配列内容を見てみてください。
    • good
    • 0

import java.util.Arrays;


import java.util.Collections;
import java.util.List;

public class Nbanme {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
Collections.shuffle(list);
System.out.printf("現在の配列内容[%d",list.get(0));
for ( int i = 1 ; i < list.size() ; i++ ){
System.out.printf(",%d",list.get(i));
}
System.out.println("]");
int num = (int)(Math.random()*10+1);
System.out.printf("%d番目に大きい要素は",num );
System.out.printf("%dです。",list.get(list.indexOf(new Integer(11 - num))));
}
}

ただし、学校の課題とかの場合この回答では○もらえないかと。
何をやっているかどうかは考えてみてください。

この回答への補足

昇順に並んでいる配列から、nを引くとn番目が出ると言う解釈で大丈夫でしょうか?

しかし、配列の内容を変更しない(入れ替えをしないと言うことだと思うのですが)
とのことで、ランダムに並んでしまうとこれは通用しないと思うのですが…。

補足日時:2009/12/01 16:46
    • good
    • 0

あ、失礼問題文を読み間違ってました。


全然違う結果を出してたので、私の1つ前の回答は無視してください。
    • good
    • 0

public static void main( String args[] ) {


int[] data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int n = random.nextInt(data.length) + 1;
System.out.print(n + "番目に大きい要素は" + (11 - n) + "です。");
}

この回答への補足

>System.out.print(n + "番目に大きい要素は" + (11 - n) + "です。");
配列の中身は数も順序もランダムになるので、は使えないんです。

補足日時:2009/12/01 16:24
    • good
    • 0

多分NGかと思いますが。



import java.util.Arrays;
import java.util.List;

public class Nbanme {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
int num = (int)(Math.random()*10);
System.out.printf("number is:%d",num );
System.out.printf(" / index is:%d",list.indexOf(new Integer(num)));
}
}

こんな方法もある、という一例です。

この回答への補足

すみません!
これはなにをしているのでしょうか・・・?
お手数でなければ教えてください!!

補足日時:2009/12/01 15:57
    • good
    • 0

data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};



rank = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

配列データの順序を指し示す配列を設定してみては、いかがでしょう。


まず、data の先頭要素が、最大と仮定し、・・・
rank = {1, 0, 0, 0, 0, 0, 0, 0, 0, 0};

 この先頭要素と、それ以外の 各data 要素とを比較する。
 仮に、比較した data要素の方が大きければ、最大要素を設定しなおす。
rank = {0, 1, 0, 0, 0, 0, 0, 0, 0, 0};

 これを、data の最終要素までの比較を繰り返し、その時点の最大要素が
結果となります。
rank = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1};


続いて、2番目に大きな要素を、上記と同様に仮設定を行い、rank 配列が
0 である data 要素との比較を繰り返す。

rank = {2, 0, 0, 0, 0, 0, 0, 0, 0, 1};

この回答への補足

新しい配列を作るのも駄目らしです・・・;
すみません、説明不足でした。

補足日時:2009/12/01 15:48
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!