4

トーナメント スタイルの比較を使用して配列リストの最大値を決定するメソッドを作成しようとしています。ただし、必要な出力を取得できず、代わりに IndexOutOfBoundsException を取得するため、while ループについて何かを理解していないと思います。

これが私のコードです:

import java.util.*;
public class TournamentMax {

public static <T extends Comparable<? super T>> ArrayList<T> tournament(ArrayList<T> tournamentArrayList) {
    ArrayList<T> winners = new ArrayList<T>();
    int n = tournamentArrayList.size();
    int upper;

    if (n % 2 != 0 ){ // if size is odd
        winners.add(tournamentArrayList.get(n));
        upper = n - 2;
    }

    else{  // if size is even
        upper = n - 1;
    }

    for (int index = 0; index < upper; index+=2){


        T winner = max(tournamentArrayList.get(index), tournamentArrayList.get(index + 1));
         System.out.println("Comparison between: " + tournamentArrayList.get(index) + " and " + tournamentArrayList.get(index + 1) );
         System.out.println("Winner was: " + winner);
        winners.add(winner);
    }

    return winners;     
}

public static <T extends Comparable<? super T>> T max (T obj1, T obj2){
    if (obj1.compareTo(obj2) > 0){
    return obj1;    
    }
    else return obj2;
}

public static <T extends Comparable<? super T>> ArrayList<T> maximum(ArrayList<T> tournamentArrayList){
    ArrayList<T> maximum = new ArrayList<T>();
    for (int i = 0; i < tournamentArrayList.size(); i++){
        maximum.add(tournamentArrayList.get(i));
    }
    while (maximum.size() > 1){
    System.out.println("maximum before tournament" + maximum);
    maximum = tournament(maximum);
    System.out.println("maximum after tournament and the one returned" + maximum);
    }   
    return maximum;


}

}

私は問題がこの部分のどこかにあることを知っています:

while (maximum.size() > 1){
    System.out.println("maximum before tournament" + maximum);
    maximum = tournament(maximum);
    System.out.println("maximum after tournament and the one returned" + maximum);

私の頭の中では、ArrayList に含まれる項目が 1 つだけになるまで、ArrayList を継続的にトーナメント メソッドに戻そうとしていますが、これが最大になるはずです。私をさらに混乱させるのは、ループが最初に実行されてから例外がスローされることです。私は再帰を正しく使用していないと思いますが、誰かが私を正しい方向に向けることができれば、それは大歓迎です!

これをテストクライアントとして使用しています:

public static void main(String... args) {
ArrayList<Integer> test = new ArrayList<Integer>();
test.add(12);
test.add(10);
test.add(65);
test.add(4);
test.add(78);
test.add(89);
test.add(99);
test.add(96);
test.add(24);
test.add(22);
ArrayList<Integer> testWinners = tournament(test);
System.out.println(testWinners);
ArrayList<Integer> testMaximum = maximum(test); 
System.out.println(testMaximum);


}
4

1 に答える 1

4

次の 2 行は、常に IndexOutOfBoundsException をスローします。これは、配列のサイズが奇数の場合に発生します。

int n = tournamentArrayList.size();
//...
winners.add(tournamentArrayList.get(n));

リストのインデックスは 0 から始まるため、リストの最後の要素は index になりますsize() - 1

于 2012-11-17T20:11:47.070 に答える