方法/构造函数中的ArrayList - Java

时间:2012-08-27 14:55:13

标签: java arraylist

搜索谷歌之后我找不到答案,我对Java不太熟悉,我大多数时候都使用C#而且我知道使用C#可能会做到并且可能是用Java编写的

Ps:对不起,我不知道如何在这里使用它。

我有一个构造函数:

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

然后,当我尝试创建直接在其上创建ArrayLists()的Object时,它不起作用:

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上无法做到这一点?

谢谢

8 个答案:

答案 0 :(得分: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.
);

当然,如果你使用Guava,你应该使用一个不可变的集合,因为你显然试图实现一个常量:

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

答案 1 :(得分:2)

如果您使用Eclipse Collections(以前为GS Collections),则可以使用FastList实施创建列表。 FastList实现了java.util.List以及更丰富的GS Collections特定类型。如果您不介意它不支持modCount,它可以用作ArrayList的替代品。使用FastList,您的代码将如下所示。

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

注意:我是Eclipse Collections的提交者

答案 2 :(得分:1)

你需要在arraylist上调用add来添加元素。

ArrayList没有自定义对象的构造函数。

示例:

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

编辑:如果需要链接add,则需要使用Arrays.asList(..)。

答案 3 :(得分:1)

试试这个:

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

- &GT;创建一个NPC阵列并从中制作一个列表

答案 4 :(得分:0)

您尝试的内容可以针对数据数组完成,但不适用于ArrayList

这有效:

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

这不是:

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

答案 5 :(得分:0)

除了Arrays.asList(),您还可以使用double brace initialization

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

答案 6 :(得分: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

答案 7 :(得分: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) ) );

还有一个Google Guava集合库,它有一个非常好的集合库,有许多辅助方法可以帮助创建和操作集合:

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