2016-11-08 253 views
-1

我有一个名为InputRow字符串,它看起来像这样:如何在HashMap中存储同一个键的多个值?

1,Kit,23 
2,Ret,211 

我申请就可以了正则表达式(.+),(.+),(.+)并存储在多个变量的结果。

对于第一线1,kit,23我得到:

InputRow.1-->1 
InputRow.2-->kit 
InputRow.3-->23 

对于第二线2,Ret,211我得到:

InputRow.1-->2 
InputRow.2-->Ret 
InputRow.3-->211 

我想在HashMap所有输入行存储使用相同的密钥InputRow。我怎么能在Java中做到这一点?

我的Java代码..,

line="1,Kit,23"; 
final Map<String, String> regexResults = new HashMap<>(); 
Pattern pattern = Pattern.compile("(.+),(.+),(.+)"); 
final Matcher matcher = pattern.matcher(line); 
if (matcher.find()) 
{ 
final String baseKey = "InputRow"; 
for (int i = 0; i <= matcher.groupCount(); i++) { 
final String key = new StringBuilder(baseKey).append(".").append(i).toString(); 
String value = matcher.group(i); 
if (value != null) { 
    regexResults.put(key, value); 
} 
} 

现在我想还可以存储在第二行“regexResults”到process.How这是可能的吗?

+0

不确定您的示例显示的是什么,但是存储多个关键字是可以通过自定义类来保存这些字段。 –

+1

发布你到目前为止做了什么.. – Jobin

+0

与我们分享你的代码,但首先阅读'hashCode()'和'equals()'方法,它应该可以帮助你将值放在'HashMap'中,同时在指定的类中覆盖它们 – roeygol

回答

3

创建一个类InputRow

class InputRow { 

    private int value1; 
    private String value2; 
    private int value3; 

    //...getters and setters 

} 

HashMap<Integer, List<InputRow>>。哈希映射键是您的行索引,并将所有匹配的行作为List<InputRow>分配给哈希映射。

对于澄清,一个HashMap商店一个条目一个独特关键。因此,您不能将多个条目分配给同一个键,否则条目将被覆盖。所以,你需要编写一个容器来覆盖多个对象或者使用像List这样的现有的容器。

实施例为您的代码

我用两个文本片段,由换行字符分隔的,所以两行。这段代码将两个InputRow对象放入列表HashMap中,并使用“InputRow”键。请注意,匹配器组索引从1开始,零指的是整个组。另外请注意,为了简单起见,我假设你创建了一个InputRow(String, String, String)构造函数。

String line = "1,Kit,23\n2,Ret,211"; 

final Map<String, List<InputRow>> regexResults = new HashMap<>(); 
Pattern pattern = Pattern.compile("(.+),(.+),(.+)"); 
final Matcher matcher = pattern.matcher(line); 

List<InputRow> entry = new ArrayList<>(); 

while (matcher.find()) { 
    entry.add(new InputRow(matcher.group(1), matcher.group(2), matcher.group(3))); 
} 

regexResults.put("InputRow", entry); 
+0

现在我为您的代码添加了一个示例。 – thatguy

1

这是不可能的。每个定义只能存储一个键。文档说

将键映射到值的对象。地图不能包含重复的键;每个键可以映射到最多一个值。

您唯一能做的就是将键映射到值列表。 Map<String, List<String>>。然后,它可能看起来像这样

InputRow.1 --> [1, kit, 23], 
InputRow.2 --> [2, Ret, 211] 
相关问题