2012-06-26 26 views
0

解析數據我在下面的方式哈希表的數據:需要一個Hashtable

key : year value : 2011 2011 
key : title value : Almayer's Folly  Faust 

我有兩個鍵和標籤空格分隔值。

我需要以下列方式輸出我的輸出。

Year  Title 
2011  Almayer's Folly 
2011  Faust 

我如何解析哈希表中的數據以所需的方式?

+0

家庭作業?如果是這樣,你應該這樣標記它。另外,你到目前爲止嘗試過什麼,以及你面臨什麼問題? – maasg

回答

1

這對我的作品,但你必須有每年爲每個標題

Hashtable<String, String> map = new Hashtable<String, String>(); 
    map.put("Year", "2011 2011"); 
    map.put("Title", "Almayer's Folly Faust"); 

    String[] rows = null; 

    for (String key : map.keySet()) { 

     String value = map.get(key); 

     String[] elements = value.split("\t"); 

     if (rows == null) { 
      rows = new String[elements.length + 1]; // Element rows + Title row 
      for (int i = 0; i < rows.length; i++) { 
       rows[i] = ""; 
      } 
     } 
     String prefix = ""; 
     if (!rows[0].equals("")) { // On first append no tab 
      prefix = "\t"; 
     } 

     rows[0] += prefix + key; // append Title 

     for (int i = 1; i < rows.length; i++) { 
      rows[i] += prefix + elements[i - 1]; // Append Data 
     } 

    } 

    for (String row : rows) { 
     System.out.println(row); 

    } 

輸出一個標題和一個年:

Year Title 
2011 Almayer's Folly 
2011 Faust 
+0

+0祝賀別人的作業,而不會挑戰OP做出努力。 – maasg

0

這是很簡單的,你可以遍歷使用一組密鑰的哈希表:

System.out.println("Year\tTitle"); 
keys = table.keySet(); 
for (String key : keys) 
    System.out.println(key + "\t" + table.get(key); 

假設今年是一個字符串。

+0

當然,這只是問題的一半。獲得密鑰後,使用該密鑰獲取字符串值,然後使用該選項卡作爲分隔符來解析字符串。 – Tony

0

首先,您的方法是管理這種結構的一種非常脆弱的方式。至少你應該讓這些值成爲某種List。我懷疑這是某種你想解決的練習/家庭作業問題。

這就是說我會用僞代碼的方式擴展pb2q的回答與託尼的評論。

結構中的選項卡對於您所需的輸出沒有用處,所以它們只會用作分隔符。

System.out.println("Year\tTitle"); 
keys = table.keySet(); 
Map<Scanner> scanners = new Map<Scanner>(); 
for (String key : keys){ 
    // Here comes the trick 
    scanners[i] = new Scanner(table.get(key)).useDelimiter("\t"); 
} 
-Print headings. 
//Now you can pull elements from each scanner until they are empty. 
boolean hasMoreElements = true; 
while(hasMoreElements){ 
    for (key : keys){ 
    print scanners[key].next() 
    } 
    printLine 
    hasMoreElements = scanners[key].hasNext() 
} 

頭上的方法,使用原始數據與令人驚訝的有用的掃描儀。

0

您的存儲數據的方法非常糟糕。在你的桌子上,你基本上表明你將會用2011年作爲你的鑰匙......這樣做!

另一個問題是,您不應該使用地圖中的選項卡來分隔不同的數據。更合理的一種更簡單的方法是將製表符分隔的數據存儲在列表中,而不使用製表符。

以下是您正在嘗試執行的操作,顯示您可以在將東西添加到地圖之前或之後將其添加到列表中。

HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>(); 
    ArrayList<String> titles2011 = new ArrayList<String>(); 
    titles2011.add("Almayer's Folly"); 
    map.put("2011", titles2011); 
    map.get("2011").add("Faust"); 

    System.out.println("Year\tTitle"); 
    for (String year : map.keySet()) { 
     for (String title : map.get(year)) { 
      System.out.println(year+"\t"+title); 
     } 
    } 

我還建議閱讀的java.util.mapjava.util.HashMap的開端。除了查找hash table的用途以及更具體地說,如何處理碰撞(一旦學習瞭如何正確使用哈希表,您將會遇到)。