2014-12-06 2 views
2

У меня есть ввод нескольких строк, где я анализирую каждый, чтобы получить определенные данные, а затем отобразить их соответственно. Дело в том, что перед их отображением мне нужно отсортировать их с некоторыми параметрами. Для уточнения:сортировать по убыванию на основе нескольких параметров в Java

String s1 = "a1 5 2014-12-05"; 
String s2 = "a2 10 2014-12-06"; 
String s3 = "a3 5 2014-12-04": 

После pasring каждой строки, мне нужно отсортировать по убыванию первого по второму параметру, а затем в соответствии с датой, когда я достигаю связь, например.

Вывод должен быть:

a2, a1, a3 

Любая идея, как это может быть достигнуто, или если бы я мог изменить путь к более эффективному один ?!

+1

Разделить строки и сравнить в соответствии с править. – mic4ael

+0

@ mic4ael вы могли бы уточнить больше ?! – omarsafwany

+0

Создайте 'Object' (да, это то, что означает первый' O' в 'OO'), который содержит три поля:' String', 'int' и' LocalDate'. Затем 'реализует Comparable ', и вы можете использовать любое количество методов для сортировки 'Collection'' MyObject'. –

ответ

2

Вы можете разобрать данные и использовать Collections#sort. Ваш класс может определить некоторый естественный порядок, используя Comparable и в том случае, если вы хотите отсортировать по убыванию, то просто передать Comparator.reverseOrder() в качестве второго арг к Collections#sort как этот

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.Date; 
import java.util.List; 

public class DateSorter { 

    static class Entry implements Comparable<Entry> { 
     String id; 
     int num; 
     Date date; 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 

     public Entry(String id, int num, String date) throws ParseException { 
      this.id = id; 
      this.num = num; 
      this.date = sdf.parse(date); 
     } 

     @Override 
     public int compareTo(Entry o) { 
      return date.compareTo(o.date); 
     } 

     @Override 
     public String toString() { 
      return id + '\''; 
     } 
    } 

    public static void main(String[] args) throws ParseException { 
     String s1 = "a1 5 2014-12-05"; 
     String s2 = "a2 10 2014-12-06"; 
     String s3 = "a3 5 2014-12-04"; 

     String[] split = s1.split(" "); 

     List<Entry> entries = new ArrayList<>(); 
     entries.add(new Entry(split[0], Integer.parseInt(split[1]), split[2])); 
     split = s2.split(" "); 
     entries.add(new Entry(split[0], Integer.parseInt(split[1]), split[2])); 
     split = s3.split(" "); 
     entries.add(new Entry(split[0], Integer.parseInt(split[1]), split[2])); 

    Collections.sort(entries, new Comparator<Entry>() { 
     @Override 
     public int compare(Entry o1, Entry o2) { 
      return o2.compareTo(o1); 
     } 
    }); 

     System.out.println(entries); 
    } 
} 

Выход

[a2', a1', a3'] 
+0

Почти там: _ Мне нужно отсортировать их по убыванию сначала в соответствии со вторым параметром, а затем в соответствии с датой_. Вам нужно отсортировать по 'id', затем по' num' и, наконец, по 'date'. –

+0

Требуется ли OP для сортировки данных дважды? Я имею в виду мы должны добавить \t \t Collections.sort (статей, новый Компаратор () { \t \t \t @Override \t \t \t общественного ИНТ сравнения (запись o1, o2 запись) { \t \t \t \t возвращение o2. num.compareTo (o1.num); \t \t \t} \t \t}); – sol4me

+0

@ sol4me Я знаю, это может показаться глупым, но я получил эту ошибку: Метод reverseOrder() не определен для типа Компаратор – omarsafwany

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

  • Нет связанных вопросов^_^