正如标题所说。我有两个班,一个是“玩家”,另一个是“团队”,其中包括一个玩家的阵营。团队类中的一个方法是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正在被标记,我不知道如何解决它。有人可以帮忙吗?
答案 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) {
接下来,allstar
是private
中的Player
字段。创建一个public
getter方法并调用它,而不是直接引用该字段。
接下来,出于某种原因,您的roster
变量和numberOfAllstars
方法为static
。没有理由这样做。只需将所有内容都设为非static
。此外,name
上的numberOfAllStars
参数没有理由;它可以被移除。
此外,一旦这样做,您将使用此for
循环运行数组的末尾,因为索引的范围从0
到size() - 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。
您可以通过以下两种方式解决:
将roster声明为Player对象的ArrayList而不是通用ArrayList
private static ArrayList<Player> roster;
将roster.get(计数器)转换为Player
类型的对象if (((Player) roster.get(counter)).allstar == true) {
numofallstars++;
}
另一个问题是您已将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();
}