如何访问属于ArrayList的对象的一部分?

时间:2014-01-21 23:51:00

标签: java class object arraylist

正如标题所说。我有两个班,一个是“玩家”,另一个是“团队”,其中包括一个玩家的阵营。团队类中的一个方法是howmanyystars,我试着看看团队中有多少allstars,但是我的布尔值出错了。

public class Player {
private String nameofplayer;
private int currentposition;
private double baverage;
private boolean allstar;

public Player (String name, int position, double battingaverage, boolean isallstar) {

    nameofplayer = name;
    currentposition = position;
    baverage = battingaverage;
    allstar = isallstar;

}

然后我有:

public class Team {

private String nameteam;
private static ArrayList roster;
private double priceofgame;
private double budget;
private int numberofgames;

public Team (String teamname, ArrayList teamroster, double price, double teambudget, int games) {

    nameteam = teamname;
    roster = teamroster;
    priceofgame = price;
    budget = teambudget;
    numberofgames = games;
}


public static int numberOfAllstars(Team name) {

    int rostersize = roster.size();

    int numofallstars = 0;
    for (int counter = 0; counter <= rostersize; counter++) {

        if (roster.get(counter).allstar == true)  numofallstars++;
    }

    return numofallstars;
} 

正如我所说,.allstar正在被标记,我不知道如何解决它。有人可以帮忙吗?

5 个答案:

答案 0 :(得分:2)

首先,您的roster属于ArrayList的原始格式,因此get方法将返回Object,而不是Player。使用泛型指定ArrayList上的“内容”:

private static ArrayList<Player> roster;

并在您的Team构造函数中:

public Team (String teamname, ArrayList<Player> teamroster, double price,
    double teambudget, int games) {

接下来,allstarprivate中的Player字段。创建一个public getter方法并调用它,而不是直接引用该字段。

接下来,出于某种原因,您的roster变量和numberOfAllstars方法为static。没有理由这样做。只需将所有内容都设为非static。此外,name上的numberOfAllStars参数没有理由;它可以被移除。

此外,一旦这样做,您将使用此for循环运行数组的末尾,因为索引的范围从0size() - 1

for (int counter = 0; counter <= rostersize; counter++) {

尝试

for (int counter = 0; counter < rostersize; counter++) {

并且,与true的比较是不必要的;条件已经是boolean。尝试

if (roster.get(counter).isAllstar())

(一旦你制作了getter方法isAllstar()

答案 1 :(得分:1)

private boolean allstar;是私有的,因此您无法在Player课程之外访问它。 在Player类中为它做geter:

public boolean getAllstar() {
    return allstar;
}

然后,在Team类中:

if (roster.get(counter).getAllstar())  numofallstars++;

答案 2 :(得分:1)

问题是allStar字段是私有的。因此,您无法在Team类中访问它。您需要创建一个getter来访问您的播放器类的allstar值。

public class Player {



     public boolean isAllStar(){
          return this.allStar;
     }
}

然后你就可以在循环中调用它了:

public static int numberOfAllstars(Team name) {

    int numofallstars = 0;    
    for (int counter = 0; counter < roster.size(); counter++) {
        if (roster.get(counter).isAllStar())  numofallstars++;
    }

    return numofallstars;
} 

请注意,数组是0基索引,所以如果应该是counter < roster.size()。也不要使用原始类型,使用泛型。

ArrayList<Player> roster;

答案 3 :(得分:1)

一个问题是您将名单声明为通用ArrayList而没有任何类型信息。

roster.get(counter)将返回一个Object而不是一个Player。

您可以通过以下两种方式解决:

  1. 将roster声明为Player对象的ArrayList而不是通用ArrayList

    private static ArrayList<Player> roster;
    
  2. 将roster.get(计数器)转换为Player

    类型的对象
    if (((Player) roster.get(counter)).allstar == true) {
        numofallstars++;
    }
    
  3. 另一个问题是您已将allstar声明为Player类中的私有变量。私有变量只能由声明它们的类访问。

    对此最好的解决方案是不要将变量的可见性从私有更改为公共。相反,您应该创建一个访问器方法,以从类外部检索变量的值。

    以下是一个例子:

    private boolean allstar;
    
    //...
    
    public boolean isAllstar() {
        return allstar;    
    }
    

    第三个问题是你的方法numberOfAllstars会抛出异常,因为for循环的终止条件不正确。

    就像数组一样,大小为n的列表将被访问,索引从0开始到n - 1.因为你的for循环在counter&lt; = rosterSize时终止,你的下一行将尝试在索引处访问List等于它的大小。该索引对List无效,因此将抛出异常。

    这是编写循环的正确方法:

    for (int counter = 0; counter < rosterSize; counter++)
    

答案 4 :(得分:0)

1-将您班级中的allstar定义为公共,或使用公共获取/私人设置属性:

private bool _allstar = false;

public string allstar
{
    get
    {
        return name;
    }
    private set
    {
        name = _allstar;
    }
}

2-最好将名单列表定义为ArrayList<Player>

3-您可以使用linq使您的功能成为一个班轮:

public static int numberOfAllstars(Team name) {
    return roster.Where (e=>e.allstar).Count();
     }