2016-11-08 248 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] 
相關問題