2015-11-06 19 views
0
Set keySet = myMultimap.keySet(); 
Iterator keyIterator = keySet.iterator(); 
while (keyIterator.hasNext()) { 
    String key = (String) keyIterator.next(); 
    List values = (List) myMultimap.get(key); 
    System.out.println("keyname " + key); 
    System.out.println("values " + values); 
} 

上述迭代產生的結果以下列順序如何迭代multimap以使用java在CSV文件中以插入順序編寫鍵和值?

keyname id 
values [1517049512, 102888752, 102888762, 1558590692, 1516493341, 1555855832, 1557068421, 1557460861, 1570321872, 1582701092] 
keyname suspended 
values [false, false, false, false, false, false, false, false] 

預期的結果應該是在形式

id   suspended  
1517049512 false 
..... 
1582701092 false 

並將其導出到CSV,我用下面的代碼。

Set<String> keys = myMultimap.keySet();   
FileWriter writer = new FileWriter("D:/Csvfile/users.csv"); 
for (String keyname : keys) { 
    writer.append(keyname); 
    writer.append(","); 
} 
writer.append("\n")   
for (String keyname : keys) { 
    String result = myMultimap.values().toString(); 
    writer.append(result); 
    writer.append("\n"); 
} 

我正在使用番石榴multimap。

任何人都可以幫助我將multimap鍵和值以正確的順序導出到CSV文件嗎?

如果我使用上面的代碼,在我的CSV文件中,我的密鑰標頭不是重複的,但我的值是重複的。鍵值對應在CSV文件中按上述順序排列。

+0

您爲「ID」的10個值和8個值「暫停」,讓你列不相關的,某些行可能有空/空值..行嗎? – nabeel

+0

它可以爲空值。這不是問題。 –

回答

0

唯一的問題是地圖沒有排序。當一套鑰匙 - 這是一套,無序的。因此你必須定義一些命令。

該解決方案按照您的預期打印數據。您只需將System.out.print替換爲輸出到文件(或將其全部收集到一個字符串中並在最後執行一次寫入)。

import com.google.common.collect.ArrayListMultimap; 
import com.google.common.collect.Multimap; 

import java.util.Arrays; 
import java.util.List; 

import static java.util.Arrays.stream; 
import static java.util.Comparator.comparingInt; 
import static java.util.stream.Collectors.joining; 

public class Main { 

    public static void main(String[] args) { 
     Multimap<String, Object> myMultimap = newMultiMap(); 

     String[] keys = myMultimap.keySet().stream().sorted().toArray(String[]::new); 
     List<?>[] values = stream(keys).map(myMultimap::get).toArray(List[]::new); 
     int maxLength = stream(values).map(List::size).max(comparingInt(i -> i)).get(); 

     System.out.println(stream(keys).collect(joining("\t"))); 
     for (int line = 0; line < maxLength; line++) { 
      for (List<?> value : values) { 
       if (line < value.size()) { 
        System.out.print(value.get(line)); 
       } else { 
        System.out.print("\t"); 
       } 
       System.out.print("\t"); 
      } 
      System.out.println(); 
     } 
    } 

    private static Multimap<String, Object> newMultiMap() { 
     Multimap<String, Object> myMultimap = ArrayListMultimap.create(); 

     myMultimap.put("id", 1517049512); 
     myMultimap.put("id", 102888752); 
     myMultimap.put("id", 102888762); 
     myMultimap.put("id", 1558590692); 
     myMultimap.put("id", 1516493341); 
     myMultimap.put("id", 1555855832); 
     myMultimap.put("id", 1557068421); 
     myMultimap.put("id", 1557460861); 
     myMultimap.put("id", 1570321872); 
     myMultimap.put("id", 1582701092); 

     myMultimap.put("suspended", false); 
     myMultimap.put("suspended", false); 
     myMultimap.put("suspended", false); 
     myMultimap.put("suspended", false); 
     myMultimap.put("suspended", false); 
     myMultimap.put("suspended", false); 
     myMultimap.put("suspended", false); 
     myMultimap.put("suspended", false); 

     myMultimap.put("verified", true); 
     myMultimap.put("verified", true); 
     myMultimap.put("verified", true); 
     myMultimap.put("verified", true); 
     myMultimap.put("verified", true); 
     myMultimap.put("verified", true); 
     myMultimap.put("verified", true); 
     myMultimap.put("verified", true); 

     return myMultimap; 
    } 

} 

輸出:

id suspended verified 
1517049512 false true 
102888752 false true 
102888762 false true 
1558590692 false true 
1516493341 false true 
1555855832 false true 
1557068421 false true 
1557460861 false true 
1570321872 
1582701092     

編輯:

寫入文件,只需用一個其寫入文件替換印刷循環。您可能需要更改行分隔符。

try (FileWriter writer = new FileWriter("D:/Csvfile/users.csv");) { 
    writer.append(stream(keys).collect(joining(","))); 
    writer.append("\r\n"); 
    for (int line = 0; line < maxLength; line++) { 
     for (int i = 0; i < values.length; i++) { 
      List<?> value = values[i]; 
      if (i != 0) { 
       writer.append(","); 
      } 
      if (line < value.size()) { 
       writer.append(String.valueOf(value.get(line))); 
      } 
     } 
     writer.append("\r\n"); 
    } 
} catch (IOException e) { 
    throw new RuntimeException(e); 
} 
+0

結果如期而至,但我需要將其導出爲CSV。你能提出一些可行的方法來完成這項任務嗎? –

+0

@LaraV我編輯了一個答案 –

+0

我得到了結果。這是完美的。 –

0
Set keySet = myMultimap.keySet(); 
Iterator keyIterator = keySet.iterator(); 

int maxLenght=-1; 

// loop to get max number of rows 
// and print Keys 
while (keyIterator.hasNext()) { 
    String key = (String) keyIterator.next(); 
    List values = (List) myMultimap.get(key); 
    maxLenght = Math.Max(maxLenght , values.size()); 
    System.out.print(Key + "\t"); 
} 

System.out.println();  // new line 
keyIterator = keySet.iterator();// reset Iterator 

// loop and print data row by row 
for(int i=0 ; i<maxLenght ; i++){ 
    while (keyIterator.hasNext()){ 
     String key = (String) keyIterator.next(); 
     List values = (List) myMultimap.get(key); 
     if(values.size() < i){ 
      System.out.print(values.get(i) + "\t"); 
     } 
     else{ 
      System.out.print("\t\t"); 
     } 
    } 
} 
在你的榜樣
相關問題