2012-08-27 23 views
4

在谷歌搜索後我找不到答案,我對Java不太熟悉,大多數時候我使用C#,並且我知道使用C#是可能的要做,可能它在Java中。在方法/構造函數中的ArrayList - Java

ps:對不起突出顯示,我不知道如何在這裏使用。

我有一個構造函數:

public WeaponsData(ArrayList<NPC> _drop, ArrayList<NPC> _buy, ArrayList<NPC> _sell) { } 

然後,當我嘗試創建對象創建的ArrayList()直接就可以了,這是行不通的:

public static WeaponsData AngelicAxe = new WeaponsData(new ArrayList<NPC>() { new NPC("Rat", "None", 0), new NPC("Dog", "None", 0) }, 
       new ArrayList<NPC>() { new NPC("Player", "All", 0) }, 
       new ArrayList<NPC>() { new NPC("Cain", "First", 5000) } 
       ); 

沒有辦法在Java上做到這一點?

謝謝

+0

http://stackoverflow.com/questions/1005073/initialization-of-an-arraylist-in-one-line –

回答

6

ArrayList沒有必要的構造函數來做到這一點。您可以包裝在一個調用的參數來Arrays.asList()

public static WeaponsData AngelicAxe = new WeaponsData(
    new ArrayList<NPC>(
     Arrays.asList(
      new NPC("Rat", "None", 0), 
      new NPC("Dog", "None", 0) 
     ) 
    ), 
// etc 
); 

或使用由Guava Framework提供的工廠方法:

public static WeaponsData AngelicAxe = new WeaponsData(
    Lists.newArrayList(
     new NPC("Rat", "None", 0), 
     new NPC("Dog", "None", 0) 
    ), 
// etc. 
); 

當然,如果你使用番石榴,你應該使用不可變收集,因爲你顯然試圖實現一個常數:

public static final WeaponsData ANGELIC_AXE = new WeaponsData(
    ImmutableList.of(
     new NPC("Rat", "None", 0), 
     new NPC("Dog", "None", 0) 
    ), 
// etc. 
); 
+0

完美無缺,謝謝大家! – Kyky

1

你需要調用加上ArrayList中添加元素。

ArrayList沒有自定義對象的構造函數。

實施例:

new ArrayList<NPC>().add(new NPC("Player", "All", 0)); 

編輯:如果添加的鏈接是要求,然後Arrays.asList(..)需要被使用。

+0

了'add'方法的提交者不允許鏈接添加呼叫,這是操作員想要的;在這個例子中,他試圖創建一個具有多於一個元素的列表。 –

0

你試過的東西可以完成的數據數組,但不是ArrayList

這工作:

new NPC[] {new NPC(...)}; 

這不:

new ArrayList<NPC>() {new NPC(...)}; 
1

試試這個:

new ArrayList<NPC>(Arrays.asList(new NPC[] { new NPC("Rat", "None", 0), new NPC("Dog", "None", 0)})) 

- >創建NPC的數組,使一個清單出來它的

0

除了數組。asList(),您也可以使用double brace initialization

ArrayList<NPC> list = new ArrayList<NPC>() {{ 
    add(new NPC("Rat", "None", 0)); 
    add(new NPC("Dog", "None", 0)); 
}}; 
+0

可以,但不應該。這是一個很好的訣竅,但一個可怕的編碼習慣! –

0

的東西風格+靈活性夫婦:

public WeaponsData(ArrayList<NPC> _drop, ArrayList<NPC> _buy, ArrayList<NPC> _sell) { } 

應該是:

public WeaponsData(Collection<NPC> drops, Collection<NBC> buys, Collection<NPC> sells) {} 

要填充Collection使用

Collection.add(element); 

如果要使用{ foo,bar,baz}的語法,請使用數組。像這樣:

NPC[] npcs = new NPC[] {foo,bar,bax}; 

然後你可以做Arrays.asList(npcs)把它放回一個List

0

內聯初始化像在Java中默認情況下不支持。 Java有「看起來」類似的東西,但它不完全相同。

這裏是你如何定義一個ArrayList內聯(使用所謂的「雙支柱初始化」技術):

ArrayList<NPC> npcs = new ArrayList<NPC>() 
{ { 
    add(new NPC()); 
    add(new NPC()); 
}}; 

正如你所看到的,不是很好。你實際上也創建了一個ArrayList的子類的實例,而不是一個ArrayList類。

在Java中,通常只使用List<T>類型來定義變量,因此您可以使用任何List實現。

考慮這個:

public WeaponsData(List<NPC> _drop, List<NPC> _buy, List<NPC> _sell) { } 

然後,你可以這樣做:

public static WeaponsData AngelicAxe = new WeaponsData(
    Arrays.asList(new NPC("Rat", "None", 0), new NPC("Dog", "None", 0)), 
    Arrays.asList(new NPC("Player", "All", 0)), 
    Arrays.asList(new NPC("Cain", "First", 5000))); 

還有一個谷歌番石榴庫集合有很多的輔助方法,援助一個非常好的集合庫在收藏創作和操作中:

查看結果:http://code.google.com/p/guava-libraries/User Guide

2

如果您使用的是Eclipse Collections(原名稱爲GS Collections),則可以使用FastList實現來創建列表。 FastList執行java.util.List以及更豐富的GS集合特定類型。它可以用作ArrayList的替代品,如果你不介意它不支持modCount。您的代碼將如下所示使用FastList

public static WeaponsData AngelicAxe = new WeaponsData( 
    FastList.newListWith( 
      new NPC("Rat", "None", 0), 
      new NPC("Dog", "None", 0) 
    ), 
// etc 
); 

注:我的Eclipse集合