2012-07-23 107 views
2

假設我有一個散列圖,其中String類型爲鍵,ArrayList類型爲值,示例{"value1"=["one","three","five"], "value2"=["two","four","six"]}其中「value1」和「value2」是鍵。我想用下面的格式寫上面的hashmap數據。 (這樣我可以讀取Excel中的CSV文件)將hashmap中的數據寫入CSV文件

value1,value2 
one,two 
three,four 
five,six 

我的想法是寫的第一項及其值如下

value1 
one 
three 
five 

然後我在RandomAccessFile考慮使用seek方法的類返回到第1行,並再次寫入第二個鍵及其值。但是我無法完成這個任務,因爲seek函數需要整個文件中的字符串長度並在其後面寫入新的字符串。雖然我希望指針跳到第一行並追加字符串。有一個更好的方法嗎?。一個快速的例子將不勝感激。

感謝

回答

1

爲什麼你不能只用4串,每行一個?事情是這樣的:

StringBuilder keyRow = new StringBuilder(); 
StringBuilder value1 = new StringBuilder(); 
StringBuilder value2 = new StringBuilder(); 
StringBuilder value3 = new StringBuilder(); 

Iterator keys = hashmap.keySet().iterator(); 
boolean notFirst = true; 
while(keys.hasNext()) { 
    String key = (String)keys.next(); 
    ArrayList list = (ArrayList)hashmap.get(key); 
    if(!notFirst) { 
     keyRow.append(","); 
     value1.append(","); 
     value2.append(","); 
     value3.append(","); 
    } 
    keyRow.append(key); 
    value1.append((String)list.get(0)); 
    value2.append((String)list.get(1)); 
    value3.append((String)list.get(2)); 
    notFirst = false; 
} 

那麼,在年底,只取4串

String csv = keyRow.toString()+"\n"+value1.toString()+"\n"+value2.toString()+"\n"+value3.toString(); 

注意,這個例子是不是真的合適CSV。帶逗號的字符串不包含在引號中。


或者如果你有成千上萬的這些行,你迭代通過HashMap一千次。爲了節省從仰視的關鍵一點時間,你可以把他們都在一個ArrayList

StringBuilder csv = new StringBuilder(); 
int row = 0; 
ArrayList<ArrayList> list = new ArrayList<ArrayList>(); 

// Write the keys row: 
Iterator keys = hashmap.keySet().iterator(); 
boolean notFirst = true; 
while(keys.hasNext()) { 
    String key = (String)keys.next(); 
    ArrayList tmp = (ArrayList)hashmap.get(key); 
    if(!notFirst) { 
     csv.append(","); 
    } 
    csv.append(key); 
    // store list 
    list.add(tmp); 
    notFirst = false; 
} 
csv.append("\n"); 


// Write the rest of the rows 
while(row<numberOfTotalRow) { 
    notFirst = true; 
    for(int x=0;x<list.size();x++) { 
     if(!notFirst) { 
      csv.append(","); 
     } 
     csv.append((String)list.get(x).get(row)); 
     notFirst = false; 
    } 
    row++; 
} 
+0

謝謝,但是我沒有隻有4行。這只是例如。我有大約一千行。 – Rkz 2012-07-23 04:42:43

+0

@Rkz那麼,另一種選擇是迭代通過HashMap大約一千次。 – 2012-07-23 05:15:23

0

你可以讓你的願望是打印出圖的方法:

public void toString(HashMap<String, ArrayList<String>> map) { 
    for(int i = 0; i < map.size(); i++) { 
     ArrayList<String> list = new ArrayList<String>(map.keySet()); 
     String key = list.get(i); 
     System.out.println(key); 
     for(int j = 0; j < map.get(key).size(); j++) 
      System.out.println(map.get(key).get(j)); 
    } 
} 
0

你想象的方式是不可能的。文件是連續的字節流。因此,在您編寫第一個值後,您的文件中會包含以下內容:「value1 \ none \ nthree \ nfive」。然後,如果你想找到位置6(在「值」之後)並插入新的字符,那麼你就會過度第一個值的第二行。以下字節不會被魔法推開。

要做到這一點,唯一的方法就是遍歷所擁有的數據,讓數據按照它們在文件中的順序輸出。所以:轉到每個值並寫入第一個元素,再次寫入每個值並寫入第二個元素,依此類推。

0

你並不需要一個RandomAccessFile文件,更好地利用這一點:

HashMap<String, ArrayList<String>> map = new HashMap<>(); 
map.put("a", new ArrayList<>(Arrays.asList(new String[]{"A1", "A2", "A3"}))); 
map.put("b", new ArrayList<>(Arrays.asList(new String[]{"B1", "B2", "B3"}))); 
map.put("c", new ArrayList<>(Arrays.asList(new String[]{"C1", "C2", "C3"}))); 
{ 
    /** 
     * Set your file printstream. For testing System.out 
     */ 
    PrintStream ps = System.out; 
    boolean first = true; 
    /** 
     * Size of the array list. Let's asume that the arraylist are of the 
     * same lenght; 
     */ 
    int s = 0; 
    /** 
     * Create a ArrayList variable because, this map class makes no guarantees 
     * as to the order of the map; in particular, it does not guarantee that 
     * the order will remain constant over time. 
     */ 
    ArrayList<Entry<String, ArrayList<String>>> l = 
      new ArrayList<>(map.entrySet()); 

    for (Entry<String, ArrayList<String>> e : l) { 
     if (first) { 
      first = false; 
      s = e.getValue().size(); 
     } else { 
      ps.print(","); 
     } 
     ps.print(e.getKey()); 
    } 
    ps.println(); 

    for (int i = 0; i < s; i++) { 
     first = true; 
     for (Entry<String, ArrayList<String>> e : l) { 
      if (first) { 
       first = false; 
      } else { 
       ps.print(","); 
      } 
      ps.print(
        e.getValue().get(i)); 
     } 
     ps.println(); 
    } 
} 

輸出:

b,c,a 
B1,C1,A1 
B2,C2,A2 
B3,C3,A3