搜索谷歌之后我找不到答案,我对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上无法做到这一点?
谢谢
答案 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集合库,它有一个非常好的集合库,有许多辅助方法可以帮助创建和操作集合: