3

Stringタイプがキーでタイプが値のハッシュマップがあるとArrayListします。たとえば{"value1"=["one","three","five"], "value2"=["two","four","six"]}、「value1」と「value2」がキーです。上記のハッシュマップデータを次の形式で書きたいと思います。(csvファイルをエクセルで読めるように)

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

私の考えは、最初のキーとその値を次のように書くことでした

value1
one
three
five

次に、クラスで seek メソッドを使用してRandomAccessFile1 行目に戻り、2 番目のキーとその値を再び書き込むことを考えていました。ただし、シーク関数はファイル全体の文字列の長さを取り、その後に新しい文字列を書き込むため、このタスクを実行できません。ポインターが最初の行にジャンプして文字列を追加するようにしたかったのですが。これを行うより良い方法はありますか?簡単な例をいただければ幸いです。

ありがとう

4

4 に答える 4

2

各行に 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 を 1000 回繰り返し処理します。キーを検索する時間を少し節約するために、それらをすべて に入れることができます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++; 
}
于 2012-07-23T04:19:43.447 に答える
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));
    }
}
于 2012-07-23T04:18:44.337 に答える
0

あなたが想像した方法は不可能です。ファイルはバイトの連続ストリームです。したがって、最初の値を書き込んだ後、ファイルには次のようになります: "value1\none\nthree\nfive"。次に、位置 6 (「値」の後) を探して新しい文字を挿入すると、最初の値の 2 行目が上書きされます。次のバイトは、魔法のように押しのけられることはありません。

これを行う唯一の方法は、ファイルにあるのと同じ順序でバイトを出力できるように、データをトラバースすることです。したがって、各値に移動して最初の要素を書き込み、再度各値に 2 番目の要素を書き込みます。

于 2012-07-23T04:21:54.790 に答える
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
于 2012-07-23T06:06:10.680 に答える