2012-07-23 3 views
2

파일로 내가 키와 String 유형과 값으로 ArrayList 유형, 예를 들어 "값 1"과 "값 2"열쇠 {"value1"=["one","three","five"], "value2"=["two","four","six"]}와 해시 맵을 말해봐. 위의 해시 맵 데이터를 다음 형식으로 작성하고 싶습니다. 내 생각은 그럼 난 RandomAccessFile의 추구 방법을 사용하여 생각하고 있었는데쓰기 데이터를 CSV가

value1 
one 
three 
five 

을 다음과 같이 첫 번째 키와 값을 기록했다

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

(나는 Excel에서 CSV 파일을 읽을 수 있도록) 클래스에서 첫 번째 줄로 돌아가서 두 번째 키와 그 값을 다시 씁니다. 그러나 나는 기능은 전체 파일에서 문자열의 길이에 소요 뒤에 새 문자열을 기록 추구하기 때문에이 작업을 수행 할 수 없습니다입니다. 포인터가 첫 번째 줄로 점프하고 문자열을 추가하기를 원했습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까? 빠른 예가 많이 감사 할 것입니다.

감사

당신은 할 수 있습니다

답변

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; 
} 

는 그런 말에, 그냥이 예제는 정말 적절한 CSV 아니라고 4 문자열

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

주 걸릴. 쉼표가있는 문자열은 따옴표로 묶지 않습니다.


또는 수천 개의 행이있는 경우 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

+0

@Rkz 다른 옵션은 HashMap을 1000 번 반복하는 것입니다. –

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 
관련 문제