2016-02-27 85 views
0

我有一個方法動態返回一個動態返回一個ArrayList

ArrayList<Player> 

這裏奮鬥是我所:

幻想類

public class Fantasy { 
    Squad team; 
    ArrayList<Player> substitutes = team.getList(substitutes); 
} 

小隊類

public class Squad { 
    ArrayList<Player> substitutes; 
    // Some code adding stuff into the ArrayList 

    public ArrayList<Player> getList(String list) { 
     return ArrayList<Player> list; << PROBLEM 
    } 
} 

我想有一個方法getList(),通過它我可以通過一個ArrayList,如果具有相同名稱的ArratList存在,這將檢查的名稱,如果是,將其返回作爲一個ArrayList。

問題是,我不知道如何檢查是否有一個ArrayList與我傳遞的字符串list相同。

可能的解決方案:

Map<String, ArrayList<Player>> arrayLists = new HashMap<String, ArrayList<Player>>(){{ 
    put("goalKeepers", goalKeepers); 
    put("defenders", defenders); 
    put("midFielders", midFielders); 
    put("strikers", strikers); 
    put("substitutes", substitutes); 
}}; 

public ArrayList<Player> getList(String list) { 
    return arrayLists.get(list); 
} 

但是,當我打電話:

ArrayList test = getList("substitute"); 

或每當我使用的GetList();我得到以下錯誤:

Cannot make a static reference to the non-static method getList(String) from the type Squad

+0

我不完全理解你的問題,但是讓'getSubstitutes()'方法返回列表:'return substitutes;'是否更有意義? – Vulcan

+0

「Squad」類中只有一個List,因此只有一個可能的列表返回。此外,你的陳述「檢查這種方法是否存在」與你的其他問題沒有任何關係。也許你應該在Java應用程序的上下文中查找術語「方法」的含義。一般而言,您的問題與目前所述無關。 –

+2

列表從哪裏來?你是否試圖通過名稱將它從任何對象成員中拉出來?這很少是一個好主意,爲什麼不使用'Map >'如果你需要將字符串配對玩家集合 –

回答

1

不是存儲替代品的名單中不同的實例變量,你應該有一個存儲團隊的名稱映射到玩家對應的列表中選擇一個領域:

public class Squad { 

    Map<String, List<Player>> substitutes = new HashMap<>(); 

    // add the player lists into the map 

    /* 
    * Returns the list of players for the given team name, 
    * can be {@code null} if no player list has been stored 
    * with the team name. 
    */ 
    public List<Player> getList(String teamName) { 
     return substitutes.get(teamName); 
    } 
} 
+0

我已經根據你的解決方案和我得到的錯誤更新了我的帖子。但它似乎應該起作用。 –

+0

看來你沒有按照我的建議去做,而是使用[double brace initialization]聲明'arrayLists'變量(http://stackoverflow.com/questions/1958636/what-is-double-brace-initialization-在-JAVA)。只需添加'substitutes.put()'調用,例如在「Squad」的構造函數中;它會工作。 –

0

有沒有辦法在使用分配給在邏輯或代碼的流變量/方法的名稱Java語言實現。

你將不得不自己實現它,例如:

public ArrayList getList(String name) { 
    if(name.equals("substitutes") && substitutes != null) { 
     return substitutes; 
    } 

    else { 
     //handle error as you like 
    } 
} 

而且你可以添加你要訪問其他列表或對象else if語句。

+0

或者有一個'Map ' – Stewart

0

如果你的球隊保持

HashMap<String, ArrayList<Player>> 

,你可以用它來返回給一個字符串鍵ArrayList中。

0

你可以使用

Map<String,ArrayList<>> myMap = new HashMap<String,ArrayList<>>(); 

在這裏你可以找到哪些arraylist字符串鍵可用。

0

想要做的事可以通過使用反射來實現。實施將是這個樣子:

public List<Player> getList(String list) { 
    try { 
     Field field = this.getClass().getDeclaredField(list); 
     return (List<Player>) field.get(this); 
    } catch (IllegalAccessException e) { 
     // do something sensible 
    } 
} 

這將檢查當前對象與您所提供的名稱成員字段,並返回該字段的值。一般來說,你應該避免反思,直到你真的知道你在做什麼,沒有別的選擇。

就你而言,你似乎遇到了Java是一種編譯語言的問題,並沒有提供一些可用於通用腳本語言的功能。編譯語言的一個主要特點是可以依賴語言來爲您找到參考。使用反射嘗試將字符串匹配到字段,可以拋棄此優點。 因此,更好的解決方案可能會像其他答案的建議一樣使用Map。

最後一件事:遵循OOP的SOLID原則,您應該依賴List接口而不是類型聲明中的ArrayList實現。 (SOLID中的'D')