【问题标题】:sort by date java basic list按日期排序java基本列表
【发布时间】:2021-07-25 09:15:49
【问题描述】:

我在 java 中有一个列表,其中包含字符串 id;city;date;days;price;vehicle 行。我需要按日期对所有内容进行排序。(它来自我阅读的 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 或正在比较少量日期。如果这是一个不好的问题,我很抱歉,我只是不知道如何将我发现的所有内容应用到我的情况中。

【问题讨论】:

  • 您已将date 定义为String。这将 100% 有效,如果您的 date 存储在 iso8601 中。不幸的是,您尚未与我们分享该信息。另外,你可以使用内置的排序功能吗?
  • @ElliottFrisch 是的,我可以使用内置功能。我很抱歉,但我不知道什么是 iso8601。但我想我的日期不是这样排序的,它总是字符串,它的输入是 dd/mm/yyyy
  • 使用 LocalDate 作为下面的建议并命名您的构造函数变量通常不是 i,c,y,d... 当您在 IDE 中使用该类时,如果您使用描述性名称命名参数,它会为您提供文档.一个字母参数是坏习惯... ISO 8601 date : 2004-02-09 字符串排序可以工作,但如果你使用不同的语言环境,它会变得混乱。

标签: java list date sorting


【解决方案1】:

您可以使用 Comparator 界面执行此操作。我更喜欢先将字符串转换成日期。

对于 dd/MM/yyyy (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);

【讨论】:

    【解决方案2】:

    您可以将日期 String 解析为日期对象,例如 LocalDateTimeInstant 等(取决于您的用例)。

    我为这个例子随机选择了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)
     ]
    

    【讨论】:

      【解决方案3】:

      这是另一个使用 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);
             
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-05
        • 2017-09-11
        • 2017-03-19
        • 2017-08-19
        • 1970-01-01
        • 1970-01-01
        • 2015-04-14
        相关资源
        最近更新 更多