java - ArrayList While 循环给出 IndexOutOfBoundsException

标签 java arraylist while-loop indexoutofboundsexception

我正在尝试编写一种方法,使用锦标赛风格比较来确定数组列表的最大值。但是,我想我对 while 循环不太了解,因为我无法获得所需的输出,而是得到了一个 IndexOutOfBoundsException。

这是我的代码:

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 不断传回锦标赛方法,直到 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);


}

最佳答案

以下两行将始终抛出 IndexOutOfBoundsException - 只要您的数组大小为奇数,就会发生这种情况:

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

由于列表索引从 0 开始,因此列表中的最后一个元素位于索引 size() - 1 处。

关于java - ArrayList While 循环给出 IndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13434224/

相关文章:

windows - 为什么我不能终止这个 while 循环?

java - 使用命令行参数输入计算 BMI

java - 哪种查找重复整数的方法更有效?

Java:CD 库教程 - 哪种数据类型来存储 CD、艺术家和歌曲?

java - 为 ArrayList 创建 setter

java - Java 循环和 if 语句中的随机数

java - 循环结束后如何重复循环

java - 如何使用QueryParser进行Lucene范围查询(IntPoint/LongPoint)

java - Spotbugs 构建问题

java - 如何使用 boja 类将一个列表添加到另一个列表