2014-01-21 83 views
0

如標題所述。我有兩個班級,一個是「玩家」,另一個是「團隊」,其中包括一個玩家陣列。我在團隊課程中的一個方法是howmanyallstars,在那裏我嘗試查看團隊中有多少個allstars,但是我的布爾值出現錯誤。如何訪問屬於ArrayList一部分的對象的一部分?

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

運動員P =(播放器)ArrayList.get(1),然後訪問p對象變量?是你想做什麼...(對象p:花名冊){Player x =(Player)roster.get(x); if(x.isAllstarts){some_counter ++}} –

+0

下面的答案涵蓋了你的實際問題,但我想補充一點,你可能不希望你的名單ArrayList或numberOfAllstars方法是靜態的。我想象那個名單對於每個團隊實例都是不同的,所以只需要使用:'private ArrayList roster;' – Volti

回答

1

的一個問題是,你聲明名冊作爲一種通用的ArrayList沒有任何類型的信息。

roster.get(計數器)將返回。一個對象,而不是球員

可以解決這個問題有兩種方式:

  1. 申報名冊播放器的ArrayList對象,而不是作爲一種通用的ArrayList

    private static ArrayList<Player> roster; 
    
  2. 角色roster.get(計數器),以類型播放機的一個目的

    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循環終止時,計數器< = rosterSize,下一行將嘗試訪問列表的索引等於它的大小。該索引對列表無效,因此將引發異常。

這裏是寫循環的正確方法:

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

private boolean allstar;是私人的,所以你不能在Player課之外訪問它。 製作geter它在Player類:

public boolean getAllstar() { 
    return allstar; 
} 

,然後在Team類:

if (roster.get(counter).getAllstar()) numofallstars++; 
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; 
2

首先,你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()

0

1在類中定義ALLSTAR爲public,或使用公共的get /私有財產集合:

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(); 
    } 
相關問題