填充Hashmap而不使用太多

时间:2017-08-18 08:43:40

标签: java

对于上下文:我需要使用与用户提供的输入相对应的值填充Hashmap。 高度为1-20,长度为A到T.用户可以通过输入来指定这些。

我的问题是,如何在不重复400次以下的情况下使用值填充Hashmap?

hashmap.put(K key, V value)

Hashmap本身看起来像HashMap<String, Square> Square是一个(现在为空)类。

3 个答案:

答案 0 :(得分:1)

为什么不使用循环,例如

for(int i=1; i<=400; i++){
  //code to insert the key and value

  //insert to the hashmap
  hashmap.put(K key, V value);
}

答案 1 :(得分:0)

如果你有400个元素,那么你肯定会使用某种数据结构(列表,数组,等等),现在,使用java8你可以流式传输它们,然后将它们收集到地图中......

List<Integer> myListOfKeys = Arrays.asList(1, 2, 3, 4, 5, 6); //or your list with 400 keys
List<Long> myListOfValues = Arrays.asList(221L, 222L, 223L, 224L, 225L, 226L);//same

Map<Integer, Long> myHashMap = IntStream.range(0, myListOfKeys.size()).boxed()
        .collect(Collectors.toMap(k -> myListOfKeys.get(k), v -> myListOfValues.get(v)));

System.out.println(myHashMap);

答案 2 :(得分:0)

您可以使用更友好的初始化语法对数据进行编码,并将其转换为循环中的地图。

例如:

Object[][] rows = new Object[][] { 
   { "A", 1, "red" }, 
   { "B", 5, "blue" },
   // ... etc. 
};

Map<String,Square> map = new HashMap<>();
for(Object[] row : rows) {
   map.put(
       (String) row[0], 
       new Square((Integer) row[1], (String) row[2])
   );
}

你也可以使用流做同样的事情:

Map <String,Square> map = Arrays.stream(rows)
     .collect(Collectors.toMap( 
          row -> (String) row[0], 
          row -> new Square((Integer) row[1], (String) row[2])
     ));

(你在问题中指定了一个HashMap。我不知道这是否是一个漏洞,或者对你来说是否是一个重要的要求。为了保证一个特定的Map实现使用{ {1}} - 但是你不应该经常需要这个。当它发生时,默认使用Collectors.toMap(keyMapper, valueMapper, mergeFunction, mapSupplier),但不能保证它会保持这种状态。)

随着代码的增长,您可能会选择从文件中读取这样的数据。

或者,只需要400 HashMap个语句!您不必手动键入每个。使用执行正则表达式搜索和替换的编辑器(vi,Emacs,Atom,TextMate,大多数IDE编辑器)。从这样的文件开始:

map.put()

正则表达式搜索模式:

a,1,red
b,5,blue
c,6,purple
... etc.

替换为:

([^,]*),([^,]*),([^,]*)

(详情因编辑而异)