У меня есть список в java, который содержит строки идентификатора строки; города; даты; дней; цены; транспортного средства. Мне нужно отсортировать все по дате (это из CSV-файла, который я прочитал) Мой список:

List <Ticket> list = new LinkedList<Ticket>();

И как это определяется:

class Ticket {
  int id;
  String city;
  String date;
  int days;
  float price;
  String vehicle;

Ticket(int i, String c, String y, int d, float p, String v) {
    id = i;
    city = c;
    date = y;
    days = d;
    price = p;
    vehicle = v;
}

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

1
Artis 2 Май 2021 в 23:26

3 ответа

Лучший ответ

Вы можете преобразовать дату String в объект даты, например LocalDateTime или Instant и т. Д. (В зависимости от вашего варианта использования).

Я случайно выбрал LocalDateTime для этого примера.

Тогда вы сможете:

tickets.add(new Ticket(1, "dsa", LocalDateTime.now().plusSeconds(5), 6, 5, "rew"));
tickets.add(new Ticket(0, "dsa", LocalDateTime.now(), 6, 5, "rew"));

List<Ticket> sortedTicketsByDate = tickets.stream()
        .sorted(Comparator.comparing(t -> t.date)) // comparing by date
        .collect(Collectors.toList());

System.out.println(sortedTicketsByDate);

Выход:

 [
  Ticket(id=0, city=dsa, date=2021-05-02T23:46:03.214, days=6, price=5.0, vehicle=rew),
  Ticket(id=1, city=dsa, date=2021-05-02T23:46:08.197, days=6, price=5.0, vehicle=rew)
 ]
2
BuildSlayer 2 Май 2021 в 21:33

Вы можете сделать это с помощью интерфейса Comparator. Я предпочитаю сначала преобразовать строку в дату.

Для примера шаблона дд / ММ / гггг (01.01.1970) (без преобразования):

List<Ticket> list = new LinkedList<Ticket>();
... //fill the list.
Collections.sort(list, new Comparator<Ticket>() {
        public int compare(Ticket t1, Ticket t2) {
            String[] dateParts1 = t1.date.split("/");
            String[] dateParts2 = t2.date.split("/");
            
            int yearResult = dateParts1[2].compareTo(dateParts2[2]);
            if (yearResult != 0) {
                return yearResult;
            }
            
            int monthResult = dateParts1[1].compareTo(dateParts2[1]);
            if (monthResult != 0) {
                return monthResult;
            }
            
            int dayResult = dateParts1[0].compareTo(dateParts2[0]);
            if (dayResult != 0) {
                return dayResult;
            }
            
            return 0;
        }
    });

Или (с преобразованием):

List<Ticket> list = new LinkedList<Ticket>();
... //fill the list.
Collections.sort(list2, new Comparator<Ticket>() {
        public int compare(Ticket t1, Ticket t2) {
            String pattern = "dd/MM/yyyy";
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
            try {
                Date date1 = simpleDateFormat.parse(t1.date);
                Date date2 = simpleDateFormat.parse(t2.date);
                return date1.compareTo(date2);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return 0;
        }
    });

Кроме того, вы можете сделать то же самое в классе с интерфейсом Comparable.

public class Ticket **implements Comparable<Ticket>** {

int id;
String city;
String date;
int days;
float price;
String vehicle;

Ticket(int i, String c, String y, int d, float p, String v) {
    id = i;
    city = c;
    date = y;
    days = d;
    price = p;
    vehicle = v;
}

**@Override
public int compareTo(Ticket o) {
    String[] dateParts1 = this.date.split("/");
    String[] dateParts2 = o.date.split("/");
    int yearResult = dateParts1[2].compareTo(dateParts2[2]);
    if (yearResult != 0) {
        return yearResult;
    }
    int monthResult = dateParts1[1].compareTo(dateParts2[1]);
    if (monthResult != 0) {
        return monthResult;
    }
    int dayResult = dateParts1[0].compareTo(dateParts2[0]);
    if (dayResult != 0) {
        return dayResult;
    }
    return 0;
}**
}

Затем:

List<Ticket> list = new LinkedList<Ticket>();
... //fill the list.
Collections.sort(list);
0
suspicioususer 2 Май 2021 в 21:33

Вот еще одна чистая версия, использующая записи Java (новая с JDK 16), которая рекомендуется для простых объектов Java (pojos), которые хранят данные.

Подробнее читайте в этой статье: https://www.baeldung.com/java-record-keyword

Вы реализуете интерфейс Comparable на основе даты, и Collections.Sort() может отсортировать ваш ArrayList на основе этого.

import java.util.ArrayList;
import java.util.Collections;


record Ticket(int id,String city,String date,int days,float price,String vehicle) implements Comparable<Ticket>{

    public int compareTo(Ticket ticket){

        return this.date.compareTo(ticket.date);
    }
}

public class Main{

    public static void main(String[] args) {

        
        Ticket ticket1 = new Ticket(1,"New York","2021-05-03",10,110.30f,"Ferrari");
        Ticket ticket2 = new Ticket(2,"Miami","2021-05-02",9,120.50f,"Porche");
        Ticket ticket3 = new Ticket(3,"Los Angeles","2021-05-01",10,150.50f,"Mercedes");
        
        var list = new ArrayList<Ticket>();

        list.add(ticket1);
        list.add(ticket2);
        list.add(ticket3);

        System.out.println("The List before sorting:\n");
        list.forEach(System.out::println);
        Collections.sort(list);
   
        System.out.println("\nThe List After sorting:\n");
        list.forEach(System.out::println);
       
    }
}
0
firephil 2 Май 2021 в 22:37