钥匙为什么多瓦莱斯使用的HashMap?(Use of Hashmap for multiple v

2019-10-18 21:16发布

我被困在这里:

我的输入文件:

123 456 789
872 727 282
123 838 831
818 833 939

现在,我需要将数据保存在一个HashMap,二维数组或任何最好的可能的替代是这样的:

key    value
123 -> 456, 789, 838, 831
872 -> 727, 282
818 -> 833, 939

什么是最好的方式(简单和优化)来实现这一点,使用的是什么?

我试图Map<String, List> rawData = new HashMap<String, List>(); 但没有成功。

我是新来的Java。 :)

Answer 1:

Map<String, List<String>> data = new HashMap<String, List<String>>();

void addValue(String key, String value) {
  if (!data.contains(key)) {
    data.put(key, new LinkedList());
  }
  data.get(key).add(value);
}

我不太确定的Java方法的确切名称,但是这应该是主要的。 每一个HashMap的关键点,一个LinkedList包含你的选择。



Answer 2:

试用

http://commons.apache.org/collections/apidocs/org/apache/commons/collections/map/MultiValueMap.html



Answer 3:

现在,你的语法和ruibm的语法结合起来,以防万一你要换个角度:

String key = "123";
String value = "456";
Map<String, ArrayList> rawData = new HashMap<String, ArrayList>();
if(!rawData.containsKey(key)){
  rawData.put(key, new ArrayList());
}
rawData.get(key).add(value);


Answer 4:

这是一个相当严格的版本,规定如下:

  • 每个键和每个值是一个三重的数字
  • 每一行必须定义键和至少一个值
  • 重复相同的密钥值在值列表不合并
  • 之后的每个三重的空间中的任何量是可以容忍的

所述的重复分配Matcher可被优化为使用Matcher#reset()代替,但在一些清晰度损失。

private static <T extends Appendable> T collectLineInto(Reader source, T sink)
  throws IOException
{
  for (int read = source.read();
       -1 != read && '\n' != read;
       read = source.read())
  {
    sink.append((char)read);
  }
  return sink;
}


static Map<Integer, List<Integer>> read(Reader reader)
  throws IOException
{
  final Pattern head = Pattern.compile("(\\d{3}) +(\\d{3})(?: +|$)");
  final Pattern tail = Pattern.compile("\\G(\\d{3})(?: +|$)");
  final Map<Integer, List<Integer>> result =
    new HashMap<Integer, List<Integer>>();
  for (final StringBuilder buf = new StringBuilder(11);
       0 != collectLineInto(reader, buf).length();
       buf.setLength(0))
  {
    final Matcher m = head.matcher(buf);
    if (!m.lookingAt())
      throw new IOException("Encountered invalid entry");

    final Integer key = new Integer(m.group(1));
    List<Integer> values = result.get(key);
    if (null == values)
    {
      values = new LinkedList<Integer>();
      result.put(key, values);
    }
    values.add(Integer.parseInt(m.group(2)));
    m.usePattern(tail);
    while (!m.hitEnd())
    {
      if (m.find())
        values.add(Integer.parseInt(m.group(1)));
      else
        throw new IOException("Encountered invalid triple");
    }
  }
  return result;
}


static Map<Integer, List<Integer>> read(InputStream is, Charset cs)
  throws IOException
{
  return read(new InputStreamReader(is, cs));
}


文章来源: Use of Hashmap for multiple vales of keys and why?