【问题标题】:How can I access a part of an object that is part of an ArrayList?如何访问属于 ArrayList 的对象的一部分?
【发布时间】:2014-01-21 23:50:59
【问题描述】:

正如标题所说。我有两个类,一个是“玩家”,另一个是“团队”,其中包括一个玩家数组列表。我在团队类中的一种方法是 howmanyallstars,我尝试查看团队中有多少个全明星,但我的布尔值出现错误。

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 已被标记,我不知道如何修复它。有人可以帮忙吗?

【问题讨论】:

  • Player p=(Player) ArrayList.get(1) 然后访问P对象变量?这就是你想要做的......这就是你的问题标题所说的可能 for(Object p : roster){Player x=(Player)roster.get(x); if (x.isAllstarts){some_counter++}}
  • 下面的答案涵盖了您的实际问题,但我想补充一点,您可能不希望您的名册 ArrayList 或 numberOfAllstars 方法是静态的。我想每个团队实例的名册都是不同的,所以只需使用:private ArrayList&lt;Player&gt; roster;

标签: java class object arraylist


【解决方案1】:

首先,您的rosterArrayList 的原始形式,因此get 方法将返回Object,而不是Player。使用泛型在您的ArrayList 上指定“什么”:

private static ArrayList<Player> roster;

在你的 Team 构造函数中:

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

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

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

此外,一旦你这样做了,你将使用这个 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()

【讨论】:

    【解决方案2】:

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

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

    你可以通过两种方式解决:

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

      private static ArrayList<Player> roster;
      
    2. 将 roster.get(counter) 转换为 Player 类型的对象

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

    另一个问题是您在 Player 类中将 allstar 声明为私有变量。私有变量只能被声明它们的类访问。

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

    这是一个例子:

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

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

    就像数组一样,大小为 n 的列表将使用从 0 开始并以 n - 1 结束的索引进行访问。因为您的 for 循环在 counter

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

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

    【讨论】:

      【解决方案3】:

      private boolean allstar; 是私有的,所以你不能在Player 类之外访问它。 在 Player 类中为它制作 geter:

      public boolean getAllstar() {
          return allstar;
      }
      

      然后,在 Team 类中:

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

      【讨论】:

        【解决方案4】:

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

        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,因此 if 应为 counter &lt; roster.size()。也不要使用原始类型,使用泛型。

        ArrayList<Player> roster;
        

        【讨论】:

          【解决方案5】:

          1- 将您的班级中的 allstar 定义为公共的,或者使用公共的 get/private 设置属性:

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

          2- 最好将名册列表定义为ArrayList&lt;Player&gt;

          3- 您可以使用 linq 使您的函数成为单行:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-11-21
            • 1970-01-01
            • 2019-03-12
            • 2013-01-12
            • 2016-10-09
            • 1970-01-01
            • 2017-07-24
            • 2015-10-27
            相关资源
            最近更新 更多