0

テキスト ファイルを読み取り、各キーが複数の値を持つツリー マップに格納します。

キー: A1BG 値: G5730 A4527 E3732 B0166

キー: BCA3 値: C1478 A4172 D8974 B1432 E2147

キー: DB8C 値: N0124 K7414 X9851

ツリー マップなので、すべてのキーを並べ替えました。次に、キーに対応するすべての値を並べ替えたいと思います。そして、o/p を取得します。

キー: A1BG 値: A4527 B0166 E3732 G5730

キー: BCA3 値: A4172 B1432 C1478 D8974 E2147

キー: DB8C 値: K7414 N0124 X9851

私はJavaが初めてです。誰でもこれを手伝ってくれますか。これが私のコードです

BufferedReader reader =  new BufferedReader(new FileReader("E:\\book\\datasone.txt"));
Map<String, String> map = new TreeMap<String,String>();
String currentLine;
while ((currentLine = reader.readLine()) != null) 
{
  String[] pair  = currentLine.split("\\s+");
  key = pair[0];
  value = pair[1];
  if(map.containsKey(key))
  {
    value +=  map.get(key);
  }
  else
  {
    map.put(key,value);    
  }
}
for (String name: map.keySet())
{
  String key =name.toString();
  String value = map.get(name).toString();  
  System.out.println(key + " " + value+ " ");  
}   
4

2 に答える 2

1

重複する値がない場合は、値を TreeSet として保存できます

public class TestMap {

    public static void main(String[] args) {

        List<String> lines = new ArrayList();
        lines.add("A1BG G5730");
        lines.add("A1BG A4527");
        lines.add("A1BG E3732");
        lines.add("A1BG B0166");
        lines.add("BCA3 C1478");
        lines.add("BCA3 A4172");
        lines.add("BCA3 D8974");
        lines.add("BCA3 B1432");
        lines.add("BCA3 E2147");
        lines.add("DB8C N0124");
        lines.add("DB8C K7414");
        lines.add("DB8C X9851");

        Map<String, Set<String>> map = new TreeMap<String,Set<String>>();
        for(String currentLine : lines){
            String[] pair  = currentLine.split("\\s+");
            String key = pair[0];
            String value = pair[1];
            if(!map.containsKey(key)){
                Set<String> set = new TreeSet<String>();
                map.put(key,set);
            }
            map.get(key).add(value);
        }
        for (String name: map.keySet())
        {
            String key =name.toString();
            System.out.print(key);
            for (String value : map.get(name)){
                System.out.print(" " + value);
            }
            System.out.println();
        }
    }
}

出力

A1BG A4527 B0166 E3732 G5730
BCA3 A4172 B1432 C1478 D8974 E2147
DB8C K7414 N0124 X9851
于 2013-08-20T02:07:09.890 に答える
0

すべての値はスペースで区切られたMapasに格納されるStringため、後処理する必要がありますMap(つまり、読み取りが終了した後に処理します)...

基本的に、各値を抽出し、スペース文字で分割して、並べ替えにString[]使用Arrays#sortします。値を再現Stringし、指定されたキーの値として戻します。

例えば...

for (String name: map.keySet())
{
  String key = name.toString();
  String value = map.get(name).toString();  
  String[] parts = value.split(" ");
  Arrays.sort(parts);
  StringBuilder sb = new StringBuilder(value.length());
  for (String part : parts) {
    if (sb.length() != 0) {
        sb.append(" ");
    }
    sb.append(part);
  }
  map.put(key, value);
}  

から始める方が簡単かもしれませんSortedMap<String, SortedSet<String>>SortedMap<String, String>そうすれば、ファイルを読み取っているときに値を並べ替えることができますが、使用しているマップを生成するには、ファイルを後処理する必要があります。

もちろん、これは重複値がないことを前提としています;)

重複する値がある場合は、SortedMap<String, List<String>>代わりに使用できます。ただし、マップのロードが完了したら、マップを後処理する必要があります。 Collections.sort(List) を使用してList、各キーに関連付けられたものをソートし、必要な値をMap生成しStringます...

ソートセットの例

BufferedReader reader = null;
try {
    reader = new BufferedReader(new FileReader("datasone.txt"));
    Map<String, SortedSet<String>> map = new TreeMap<String, SortedSet<String>>();
    String currentLine;
    while ((currentLine = reader.readLine()) != null) {
        String[] pair = currentLine.split("\\s+");
        String key = pair[0];
        String value = pair[1];
        SortedSet<String> set = map.get(key);
        if (set == null) {
            set = new TreeSet<String>();
            map.put(key, set);
        }
        set.add(value);
    }
    for (String name : map.keySet()) {
        String key = name.toString();
        SortedSet<String> set = map.get(key);
        StringBuilder sb = new StringBuilder(128);
        sb.append(key).append(":");
        for (String value : set) {
            sb.append(" ").append(value);
        }
        System.out.println(sb.toString());
    }
} catch (IOException exp) {
    exp.printStackTrace();
} finally {
    try {
        reader.close();
    } catch (Exception e) {
    }
}

読み方は...

A1BG G5730 
A1BG A4527 
A1BG E3732 
A1BG B0166
BCA3 C1478 
BCA3 A4172 
BCA3 D8974 
BCA3 B1432 
BCA3 E2147
DB8C N0124 
DB8C K7414 
DB8C X9851

そして生成...

A1BG: A4527 B0166 E3732 G5730
BCA3: A4172 B1432 C1478 D8974 E2147
DB8C: K7414 N0124 X9851
于 2013-08-20T02:07:29.873 に答える