我被困在这里:
我的输入文件:
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。 :)
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
包含你的选择。
试用
http://commons.apache.org/collections/apidocs/org/apache/commons/collections/map/MultiValueMap.html
现在,你的语法和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);
这是一个相当严格的版本,规定如下:
- 每个键和每个值是一个三重的数字
- 每一行必须定义键和至少一个值
- 重复相同的密钥值在值列表不合并
- 之后的每个三重的空间中的任何量是可以容忍的
所述的重复分配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));
}