2012-05-25 3 views
1

У меня возникла проблема при сортировке. Формат данных:сортировка данных в файле

b4 S0_c5 t 0.426544 
b6 S1_c5 t 1.51049 
b13 S0_c5 t 0.594502 
b13 S1_c5 t 0.537496 
b15 S1_c5 t 0.884126 
b18 S0_c5 t 0.500933 
b19 S1_c5 t 0.628472 
b22 S0_c5 t 0.437718 

и требуемый результат является:

S0_c5 b13 0.594502 b18 0.500933 b22 0.437718 b4 0.426544 
S1_c5 b6 1.51049 b15 0.884126 b19 0.628472 b13 0.537496 

значение также в порядке убывания. Заранее спасибо.

+0

Ключ к сортировке? b4, b6, b13? –

+0

Элементы сгруппированы по 2-й колонке и отсортированы по 4-й колонке. – nhahtdh

+0

Я думаю, что ваш вопрос заключается в том, чтобы выжить. Это не «Сделать мой сайт для работы». –

ответ

2

Поместите данные в TreeList<String, List<String>> (потому что это сортируется), где второе слово из последовательности является ключом, а значение списка строк, а затем отсортировать каждый список вы получите это путь:

Map<String, List<String[]>> map = new TreeMap<String, List<String[]>>(); 
    for (String s : strings) { 
     String[] tokens = s.split(" "); 
     List<String[]> values = map.get(tokens[1]); 
     if (values == null) { 
      values = new ArrayList<String[]>(); 
      map.put(tokens[1], values); 
     } 
     values.add(new String[]{tokens[0], tokens[3]}); 
    } 

    for (String key : map.keySet()) { 
     List<String[]> list = map.get(key); 
     Collections.sort(list, new Comparator<String[]>() { 

      @Override 
      public int compare(String[] o1, String[] o2) { 
       return o1[1].compareTo(o2[1]) * -1; 
      } 

     }); 

     System.out.print(key + " "); 
     for (String[] s : list) { 
      System.out.print(s[0] + " " + s[1]); 
     } 
     System.out.println(); 
    } 

Обновление: Например читать из файла:

BufferedReader br; 
    try { 
     br = new BufferedReader(new FileReader("d:/temp/r.res")); 

     Map<String, List<String[]>> map = new TreeMap<String, List<String[]>>(); 
     while (br.ready()) { 
      String s = br.readLine(); 
      if (!s.trim().isEmpty()) { 
       String[] tokens = s.split(" "); 
       List<String[]> values = map.get(tokens[1]); 
       if (values == null) { 
        values = new ArrayList<String[]>(); 
        map.put(tokens[1], values); 
       } 
       values.add(new String[]{tokens[0], tokens[3]}); 
      } 
     } 
    } finally { 
     br.close(); 
    } 
+0

Обновление: добавлен пользовательский компаратор для сортировки в порядке убывания. – tibtof

+0

plz дают некоторое предположение, на самом деле ввод, данный вам, который вы храните в «String [] strings =», на самом деле он исходит из файла, содержимое которого меняется.Имя файла - «r.res». – adityak

+0

@adityak проверьте обновление – tibtof

1

Введите данные в категорию List и используйте Collections.sort().

1

есть класс в JDK только для того, чтобы иметь отсортированный список. Он назван (несколько не в порядке с другими Сортированными * интерфейсами) «java.util.PriorityQueue». Он может сортировать либо Comparables, либо использовать Comparator.

Разница со списком, отсортированным с использованием Collections.sort (...), заключается в том, что это будет поддерживать порядок в любое время и иметь хорошую производительность вставки с использованием структуры данных кучи, где вставка в отсортированном ArrayList будет равна O (n) (т. е. используя двоичный поиск и перемещение).

Однако, помимо списка, PriorityQueue не поддерживает индексированный доступ (get (5)), единственный способ доступа к элементам в куче - это вынуть их по одному (таким образом, имя PriorityQueue).

2
  • Разделите свои данные на ''.
  • Создать HashMap<String, List<String[]>>
  • для каждой строки:
    • Посмотрите, если карта содержит ключ (раскол [1])
      • Если нет списка в этом ключе создайте один
      • надстройки раскол [1], разделить на соответствующий список
  • Итерация по вашей карте и порядок каждого List
  • Выходные данные
1

Попробуйте это. Это будет работать.

private void ReadTextFile(String filename) throws IOException 
    { 
     BufferedReader br = null; 
     FileInputStream fin = null; 
     fin = new FileInputStream(filename); 
     br =new BufferedReader(new InputStreamReader(fin)); 
     Map<String,String> stringStringMap = new TreeMap<String, String>(Collections.reverseOrder()); 
     while ((line = br.readLine()) != null) { 
      stringStringMap.put(line.split(" ")[3],line); 
     } 
     Collection<String> collection = stringStringMap.values(); 
     Map<String, List<String>> map = new TreeMap<String, List<String>>(); 
     Iterator<String> iterator = collection.iterator(); 
     while(iterator.hasNext()){ 
      String[] tokens = iterator.next().split(" "); 
      List<String> values = map.get(tokens[1]); 
      if (values == null) { 
       values = new ArrayList<String>(); 
       map.put(tokens[1], values); 
      } 
      values.add(tokens[0] + " " + tokens[3]); 
     } 
     for (List<String> mapList : map.values()) { 
      Collections.sort(mapList); 
     } 
     for (String key : map.keySet()) { 
      System.out.println(key + " " + map.get(key)); 
     } 
    } 
Смежные вопросы