2016-09-11 2 views
0

Прошу прощения, если это дубликат, но я не смог найти решение в сообщениях, которые я читал.Сортировка ArrayList пользовательских объектов одним из его членов

У меня есть собственный класс, который содержит несколько строк и дату. Я создал и ArrayList этой структуры, и теперь я хочу, чтобы этот ArrayList был отсортирован от самого нового до самого старого, используя поле Date. Как я могу отсортировать этот список? Есть ли способ создать пользовательский компаратор, который будет сортировать ArrayList в соответствии с датой в моем классе?

Мой код класса:

public class ParsedWebData { 

String title; 
String url; 
String description; 
Date date; 
String dateString; 

public ParsedWebData() { 

} 

public ParsedWebData(String title, String url, String description, Date date, String dateString) { 
    this.title = title; 
    this.url = url; 
    this.description = description; 
    this.date = date; 
    this.dateString = dateString; 
} 

public String getTitle() { 
    return title; 
} 


public String getUrl() { 
    return url; 
} 

public String getDescription() { 
    return description; 
} 

public Date getDate() {return date;} 

public String getDateString() {return dateString;} 


} 

Так что мой ArrayList декларация выглядит следующим образом:

ArrayList<ParsedWebData> data = new ArrayList<>; 

EDIT 1

Я пытался использовать:

list.sort(Comparator.comparing(ParsedWebData::getDate)); 

Но я получаю:

Call requires API level 24 (current min is 16): java.util.ArrayList#Sort 

ответ

1

Да, это можно сделать с помощью пользовательского компаратора:

data.sort(Comparator.comparing(ParsedWebData::getDate).reversed()); 

reversed() вызова сортировать от нового к старому, а не естественный порядок старых к новому.

Другие решения включают в себя:

  • Сортировка, как вы используете элементы (data.stream().sorted(...))
  • Используйте коллекцию, которая сортирует по мере добавления
  • Продлить Comparable если это естественный порядок
+0

Этот метод требует API 24, и я хочу, чтобы сохранить совместимость с более низкими устройствами API – TheTechGuy96

0

Было бы проще использовать SortedSet (у ArrayList нет встроенной сортировки, TreeSet - это конкретная реализация), а затем передать пользовательский Компаратор, который просто делегирует объект даты.

Так TreeSet получает построен как нечто вроде

set = new TreeSet<ParsedWebData>(new CustomComparator<ParsedWebData>()); 

И ключевой метод пользовательского компаратора реализован как ниже.

int compare(T o1, T o2) { 
    return o1.date.compare(o2.date); 
} 
+0

'ArrayList' могут быть отсортированы с помощью [' Collections.sort'] (https://docs.oracle.com/javase /8/docs/api/java/util/Collections.html#sort-java.util.List-java.util.Comparator-), или в Java 8 существует ['List # sort'] (https: // docs.oracle.com/javase/8/docs/api/java/util/List.html#sort-java.util.Comparator-). Использование 'TreeSet' будет удалять дубликаты. – 4castle

+0

Я смотрел 7 документации; вы правы. list.sort. –

+0

Создание списка в наборе изменяет его семантику: он удаляет дубликаты, а также сортировку. – sprinter