2009-12-28 22 views
1

我堅持在這裏:使用Hashmap來處理多個鍵值,爲什麼?

我輸入文件:

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。 :)

+0

「精簡優化」 - 尼斯的要求。可能是得可徘徊。 – 2009-12-28 13:47:10

+0

所有鍵/值總是數字嗎?如果是這樣,0123與0123不同?另外,如果他們都是數字,他們可以多大/多小? – MAK 2009-12-28 14:31:25

+0

是否需要合併右側三元組中的任何副本?該列表是否真的是有序集合,還是它必須容忍重複? – seh 2009-12-28 14:36:02

回答

11
​​

我不太確定java方法的確切名稱,但這應該主要是它。每個HashMap鍵指向一個包含您的選項的LinkedList

+5

我會考慮使用集而不是列表,以防我不希望重複收集價值集合 – Yaneeve 2009-12-28 14:08:37

+0

是的,保留重複是我的req中不可接受的。那麼,設置將是一個更好的選擇? – zengr 2009-12-28 14:12:01

+1

@unknown,是一個集將刪除所有重複你。 LinkedHashSet將保留插入順序,但如果您不關心順序,請使用HashSet。如果你想排序,使用TreeSet。 – Yishai 2009-12-28 14:30:36

0

我們你的語法和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); 
+0

進行格式化...但Jung對原始答案進行了一些編輯,類似於我的答案。 – user239585 2009-12-28 14:32:03

+0

好的,對我來說工作正常,只是最後一個問題,當我編譯java文件時,它給出了一個警告: 注意:filenae。java使用未經檢查或不安全的操作。 注意:使用-Xlint重新編譯:取消選中以獲取詳細信息。因爲這一行: Data.put(key,new ArrayList()); 這是一個嚴重的問題嗎? – zengr 2009-12-28 16:16:54

+0

您的警告是因爲您在實例化ArrayList時沒有使用泛型。 – Eldelshell 2009-12-28 16:47:51

0

這是一個相當嚴格的版本,規定如下:

  • 每個鍵和每個值是數字三位數
  • 每行必須定義一個鍵和至少一個數值
  • 爲同一個鍵重複的值不合併到數值l中IST
  • 的空間的任何量的每個三元組

後耐受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)); 
} 
+0

@seh老兄,你搖滾! – zengr 2009-12-28 16:29:00

+0

謝謝。我更新了'read()'函數來檢測並報告無效的輸入數據。 – seh 2009-12-29 16:14:28

相關問題