0

次の方法でハッシュテーブルにデータがあります:

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

タブ スペースで区切られた 2 つのキーと値があります。

次の方法で出力する必要があります。

Year     Title
2011     Almayer's Folly
2011     Faust

必要な方法でハッシュテーブルのデータを解析するにはどうすればよいですか??

4

4 に答える 4

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
于 2012-06-26T17:46:12.683 に答える
0

これは非常に簡単です。キーのセットを使用してHashTableを反復処理できます。

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

年が文字列であると仮定します。

于 2012-06-26T16:28:03.320 に答える
0

データを保存する際のあなたのアプローチはひどいものです。あなたのテーブルでは、基本的に2011年をキーとして使用することを示しています...そうしてください!

もう1つの問題は、異なるデータを区切るためにマップ内のタブを含む文字列を使用しないことです。より論理的な簡単な方法は、タブで区切られたデータをタブなしのリストに格納することです。

これがあなたがやろうとしていることであり、マップに追加する前または後にリストに何かを追加できることを示しています。

    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の冒頭を読むことをお勧めします。ハッシュテーブルの目的と目的、より具体的には、衝突の処理方法(ハッシュテーブルの適切な使用方法を学習すると、衝突に対処する方法)を調べるだけでなく。

于 2012-06-26T17:16:08.790 に答える
0

まず、あなたのアプローチは、この種の構造を管理するための非常に壊れやすい方法です。少なくとも、値をある種のリストにする必要があります。これは、あなたが解決したい問題のようなある種の運動/宿題だと思います。

そうは言っても、トニーの発言で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()
}

驚くほど便利なスキャナーで元のデータを使用する、正面からのアプローチ。

于 2012-06-26T16:58:15.770 に答える