2016-02-28 4 views
0

Я пытаюсь сделать функцию, которая позволяет sort датам в порядке убывания или возрастанию. Тем не менее, я не слишком уверен, как я должен это делать. Это то, что я работал так далеко, но получил полностью застрял:Сортировка списка массивов?

public void sortByYear() { 
    String askID = JOptionPane.showInputDialog(null, "Would you like to sort by ascending or descending?"); 
    if(askID.equalsIgnoreCase("ascending")){ 
     for(String datePersons : personList){ 
     String[] splitPerson = datePersons.split("_"); 
     String date = splitPerson[5]; 
     } 
    } else if(askID.equalsIgnoreCase("descending")){ 

    } 
} 

формат, что мои ArrayList работает с, это: ID_NAME_MAIL_PHONE_CITY_DATETIME#

Который в ArrayList, с данными в нем, выглядит например:

7_Geoffrey [email protected]_1-382-295-5799_Warwick_2010-03-27 09:47:41 

Если бы у меня было 99 разных лиц с разными датами, как бы я мог их отсортировать? Я использовал эту часть, чтобы разделить и найти даты:

String[] splitPerson = datePersons.split("_"); 
String date = splitPerson[5]; 

С наилучшими пожеланиями.

+0

Посмотрите это: http://stackoverflow.com/questions/15085608/how-to-sort-an-arraylist-of-date-in-ascending-and-descending-order-which-is-in-s – developer033

+0

Это настоящие пользовательские данные в вашем примере 'dataPersons' ?? : -O –

+0

Создал пользовательские данные от моего учителя. Он дал нам 99 строк пользовательских данных для работы, однако я застрял в этом последнем вопросе в течение последних 3 часов. –

ответ

2

Используйте метод Arrays.sort и используйте пользовательский компаратор. В реализации компаратора проанализируйте строку даты, создайте объект даты и сравните их.

т.е.

Arrays.sort(personList, new Comparator<String>() { 
    public int compare(String person1, String person2) { 
     Date date1 = parseDate(person1); 
     Date date2 = parseDate(person2); 
     return date1.compareTo(date2); 
     //return date2.compareTo(date1) for reverse order 
    } 
}); 

Если personList является список/Коллекция, а не массив, использование своего рода метод Collections класса, который работает аналогично методу Arrays.sort.

+0

Извините, если это может быть слишком просто спросить, но откуда взялись date1 и date2? Будет ли это автоматически проходить через все 99 линий людей, а не только 2? –

+0

Вы должны реализовать метод parseDate. Да, он будет запускать столько сравнений, сколько необходимо для правильного сортировки вашего списка или массива. Метод parseDate будет выглядеть примерно так: private Date parseDate(String person) { String[] splitPerson = person.split("_"); String date = splitPerson[5]; return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(date); }

0

Сначала проанализируйте строку даты в надлежащий объект java.util.Date, используя, например, a java.text.SimpleDateFormat (при условии, что ваши даты будут последовательно отформатированы). Затем вы можете отсортировать список Date, используя натуральный порядок или обратный порядок, в зависимости от значения askID.

Обратите внимание, что нет необходимости писать пользовательский компаратор, поскольку обратный компаратор выходит из коробки: java.util.Collections.reverseOrder(). Ниже приведен пример фрагмента:

public static void sortByYear() throws ParseException { 
    // ... 
    DateFormat format = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss"); 
    List<Date> dateList = new ArrayList<>(); 
    for (String date : personList) { 
     Date parsedDate = format.parse(date); 
     dateList.add(parsedDate); 
    } 
    if (askID.equalsIgnoreCase("ascending")) { 
     Collections.sort(dateList); 
    } else { 
     Collections.sort(dateList, Collections.reverseOrder()); 
    } 
} 
0

объектно-ориентированное решение проблемы было бы создать класс модели, Person, для проведения различных атрибутов, которые в настоящее время объединены в одну строку. Затем вы можете установить Person интерфейс Comparable, например. как это:

public class Person implements Comparable<Person>{ 

    private Date dateTime; 

    /* 
    * Clip other fields, constructor and accessor methods. 
    */ 

    @Override 
    public int compareTo(Person other) { 
     return this.dateTime.compareTo(other.dateTime); 
    } 
} 

Теперь о том, что упорядочение Person будет определяться на основе атрибута dateTime, сортировка List<Person> myPersonList в порядке возрастания DATETIME так просто, как Collections.sort(myPersonList) и сортировка по убыванию так просто, как Collections.sort(myPersonList, Collections.reverseOrder()).

В качестве альтернативы, быстрое и грязным решение проблемы заключается в создании пользовательских Comparator, что позволит вам заказать список List<String> myStringList на основе маркеров даты и времени (в индексе 5, когда расщепляется _ разделителя) каждого элемента:

public class UserInfoDateTimeComparator implements Comparator<String> { 

    // see docs for correct format: 
    // https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html 
    private static final DateFormat DATETIME_FORMAT = new SimpleDateFormat(...) 

    @Override 
    public int compare(String s1, String s2) { 

     // guards for null parameters 
     if (s1 == null) { 
      return s2 == null ? 0 : -1; 
     } else if (s2 == null) { 
      return 1; 
     } 

     try { 
      Date dateTime1 = DATETIME_FORMAT.parse(s1.split("_")[5]); 
      Date dateTime2 = DATETIME_FORMAT.parse(s2.split("_")[5]); 
      return dateTime1.compareTo(dateTime2); 
     } catch (ParseException e) { 
      throw new IllegalArgumentException(e); 
     } 
    } 
} 

Comparator<String> myComparator = new UserInfoDateTimeComparator() с, myStringList могут быть отсортированы по Collections.sort(myStringList, myComparator) в порядке возрастания даты и времени и через Collections.sort(myStringList, Collections.reverseOrder(myComparator)) в порядке убывания.

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