public static void main(String[] args){
........................
for(int i = 0; i<play.size(); i=i+1){
        System.out.println("the Winner is; " +Winners(play).get(i).name);
    }
}


这是主要方法。我没有在这里写下一切,因为它是不必要的。基本上我在做什么,就是我正在调用以Winners作为参数的ArrayList<Game>方法。 playArrayList<Game>类型。在此,我想获取存储在其中的元素并获取其名称。以便在屏幕上显示获奖者的姓名。我之所以循环它,是因为可以有几个赢家。取决于多少个分数相同。

private static ArrayList<Game> Winners(ArrayList<Game> gamers){
    ArrayList<Game> winner = new ArrayList<Game>();

    for(int i = 1; i==gamers.size(); i=i+1){

        if(gamers.get(i).getPoints()>gamers.get(i-1).getPoints()){     winner.clear();
            winner.add(gamers.get(i));
        }
        else if(gamers.get(i).getPoints()<gamers.get(i-1).getPoints()){ winner.clear();
            winner.add(gamers.get(i-1));
        }

        else if(gamers.get(i).getPoints()==gamers.get(i-1).getPoints()){ winner.clear();
            winner.add(gamers.get(i));
            winner.add(gamers.get(i-1));
        }

    }

    return winner;
}


Winners方法返回一个Arraylist<Game>,这是存储得分最高的一个或多个游戏者的位置。
我循环遍历每个gamers,并将它们的points相互比较。得分最高的人将存储在Winner数组列表中。

我总是在某些元素进入内部时清除winner数组列表,因为我只希望将最上面的点存储在那里。

我的问题是,我不知道自己是否正确。因为我遇到了错误
System.out.println("the Winner is; " +Winners(play).get(i).name);上。
它说索引0大小为0(indexoutofboundsexception)

最佳答案

for(int i = 1; i==gamers.size(); i=i+1)


这意味着当i==gamers.size()为假时,循环将终止。当i = 1时第一次出现,但是gamers.size()大于1。它永远不会进入循环。并返回空列表。当您尝试从一个空列表中获取一个元素时,您将获得异常。

但我认为您想检查i < gamers.size()。有可能:

for(int i = 1; i < gamers.size(); i++)


同样,在每个if块中都不需要winner.clear()。相反,您可以:

private static ArrayList<Game> Winners(ArrayList<Game> gamers) {
    ArrayList<Game> winner = new ArrayList<Game>();

    for (int i = 1; i < gamers.size(); i++) {
        winner.clear();

        if (gamers.get(i).getPoints() > gamers.get(i - 1).getPoints()) {
            winner.add(gamers.get(i));
        } else if (gamers.get(i).getPoints() < gamers.get(i - 1).getPoints()) {
            winner.add(gamers.get(i - 1));
        } else { // last check when points are equal
            winner.add(gamers.get(i));
            winner.add(gamers.get(i - 1));
        }
    }
    return winner;
}


N.B:您的Winners()方法的方法存在问题。您正在遍历gamers并将winner添加到列表中。但是每次您清除清单时。这意味着您只会从最后两名玩家中获胜。以前的获奖者将被清除。我认为您需要重新检查。

清除列表时,winner列表的大小将与play的大小不同。结果,您还将在此代码中获得异常。

for(int i = 0; i < play.size(); i=i+1) {
    System.out.println("the Winner is; " + Winners(play).get(i).name);
}


一种解决方法可能是:

ArrayList<Game> winnersList = Winners(play);
for(int i = 0; i < winnersList.size(); i++) {
    System.out.println("the Winner is; " + winnersList.get(i).name);
}

10-08 00:57