在一步中声明并将字符串数组放入HashMap中

5

我正在尝试像这样在Java中向HashMap中插入静态数据:

HashMap<String,String[]> instruments = new HashMap<String, String[]>();
instruments.put("EURUSD", {"4001","EURUSD","10000","0.00001","0.1","USD"});

但是编译器不喜欢这样。我发现将数据插入HashMap的唯一方法是先单独声明字符串数组,然后再将其放入HashMap中,就像这样:

String[] instruDetails = {"4001","EURUSD","10000","0.00001","0.1","USD"};
instruments.put("EURUSD", instruDetails);

但它不太表达清楚,而且难以维护。

那么我的问题是,有没有一种方法可以在一步/行中完成put()操作和字符串数组声明?


2
应该是 new String[]{ 数组元素 }。 - Shashank Kadne
3个回答

12
这将会达到目的:
instruments.put("EURUSD", new String[]{"4001","EURUSD","10000","0.00001","0.1","USD"});

@Baz 谢谢,这正是我在寻找的。 - Nobody
你能在那个数组里添加一些内容吗? - smatthewenglish
@S.Matthew_English 只需在末尾添加一个新的字符串。也许我不理解你的问题? - Baz

8
为了在一句话中表达所有内容,使用双括号初始化:-
 HashMap<String,String[]> instruments = new HashMap<String, String[]>() {
     {
      put("EURUSD", new String[]{"4001","EURUSD","10000","0.00001","0.1","USD"});
      put("EUR", new String[]{"4001","EURUSD","10000","0.00001","0.1","USD"});
     }
 };

也被称为实例初始化块 - Ted Hopp
它还在子类化HashMap - Bhesh Gurung
@BheshGurung。是的,这是真的。但既然OP想要一步完成,所以我给了他。:) :) - Rohit Jain
我认为实际问题是为什么put方法调用不起作用。但是你还是向OP介绍了一些新东西,我认为这很好。+1 :) - Bhesh Gurung
@RohitJain 谢谢,这很有用。我以前见过使用监听器的这种结构,但没有意识到子类化也适用于 HashMap。将会更经常地使用这个结构。 - jule64

6
我认为你已经知道了它是如何工作的。但是原因是
instruments.put("EURUSD", {"4001","EURUSD","10000","0.00001","0.1","USD"});

原因是代码中的{"4001","EURUSD","10000","0.00001","0.1","USD"}无法执行。在Java中,{}是一个用于初始化数组的语法糖或简写形式。它有一个限制条件,即必须始终与数组声明语句一起使用,否则会出现语法错误。例如:
String[] array = {"1", "2"};

这样Java就知道需要为您创建的数组实际上是由String类型元素组成的。

如果您将上述语句拆分如下

String[] array;
array = {"1", "2"};

它不能编译。

使用 new String[]{"4001","EURUSD","10000","0.00001","0.1","USD"},编译器知道需要实例化一个新的数组,其元素类型为 String (new String[]),并使用您提供的值 ({"4001","EURUSD","10000","0.00001","0.1","USD"}) 初始化新实例化的数组。


但是,一旦你把它放在那里,如何向数组中添加元素呢? - smatthewenglish
你可以通过哈希映射获取数组。但如果你的意思是要添加,那就不行。 - Bhesh Gurung
我按照底部的Amit建议这里做了那件事,你认为这是一个好的解决方案吗?你知道怎么打印类似那样的东西吗? - smatthewenglish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接