4

在谷歌搜索后,我找不到答案,我对 Java 不太熟悉,我大部分时间都使用 C#,我知道使用 C# 是可能的,而且可能是在 Java 中。

Ps:对不起,Highlight,我不知道如何使用它。

我有一个构造函数:

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

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

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

谢谢

4

8 回答 8

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.
);
于 2012-08-27T14:57:41.683 回答
2

如果您使用的是Eclipse Collections,则可以使用该FastList实现来创建一个列表。 FastList实现java.util.List以及更丰富的 Eclipse Collections 特定类型。ArrayList如果您不介意它不支持 modCount,它可以用作 的替代品。您的代码使用FastList.

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

注意:我是 Eclipse Collections 的提交者

于 2012-09-06T15:26:42.667 回答
1

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

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

例子:

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

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

于 2012-08-27T14:57:10.090 回答
1

试试这个:

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

--> 创建一个 NPC 数组并从中列出

于 2012-08-27T15:00:45.593 回答
0

您尝试的东西可以用于数据数组,但不能用于ArrayList

这有效:

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

这不会:

new ArrayList<NPC>() {new NPC(...)};
于 2012-08-27T14:59:12.000 回答
0

除了 Arrays.asList() 您还可以使用双括号初始化

ArrayList<NPC> list = new ArrayList<NPC>() {{
    add(new NPC("Rat", "None", 0));
    add(new NPC("Dog", "None", 0));
}};
于 2012-08-27T15:00:55.803 回答
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

于 2012-08-27T15:01:04.397 回答
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/和用户指南

于 2012-08-27T15:04:40.793 回答