2013-08-20 3 views
0

Я прочитал текстовый файл и хранится в виде дерева карты с каждым ключом, имеющей несколько values.Like,Сортировка значений в TreeMap

ключ: значение A1BG: G5730 A4527 E3732 B0166

ключ: BCA3 значения : C1478 A4172 D8974 B1432 E2147

ключ: значение DB8C: N0124 K7414 X9851

Поскольку карта дерево я получил все ключи sorted.Now, я хочу, чтобы отсортировать все эти значения, соответствующие key.And получить o/p As,

ключ: значение A1BG: A4527 B0166 E3732 G5730

ключ: значение BCA3: A4172 B1432 C1478 D8974 E2147

ключ: значение DB8C: K7414 N0124 X9851

Iam новой для java.Can кто поможет через это. Вот мой код

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+ " "); 
} 
+0

возможно дубликат [Как сортировать TreeMap на основе своих ценностей?] (Http://stackoverflow.com/questions/1448369/how-to-sort-a-treemap-based-on-its- значения) – smonff

ответ

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 
+0

Сохраняет данные мусора в значениях. Может у, пожалуйста, помогите мне разобраться в этом. – trx

+0

Я переделал код и включил вывод, когда я его запустил. – BevynQ

0

Поскольку все значения сохраняются в Map как String s, разделенные пробелом, вам нужно будет обработать 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 вы хотите ...

SortedSet пример

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 
+0

Никогда не видел SortedMap , возможно, вы имеете в виду SortedSet или List? – Taylor

+0

@ Тейлор Ах, вернемся к постели, я думаю: P – MadProgrammer

+0

И, пожалуйста, дайте пример SortedMap .... – trx

Смежные вопросы