代码之家  ›  专栏  ›  技术社区  ›  Mohseen Mulla

排序列表<对象>获取日期,其中日期为字符串类型

  •  2
  • Mohseen Mulla  · 技术社区  · 7 年前

    我有一个对象列表,其中数据如下:

    public class User {
        public String name;
        public String date;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getDate() {
            return date;
        }
        public void setDate(String date) {
            this.date = date;
        }
    }
    
    • Xyz 11-10-2012
    • Pqr 20-04-2012
    • Mno 22-05-2014

    如何根据字符串形式的日期对数据(即名称)进行排序。我需要按年份、月份和日期进行排序。 我已尝试使用以下代码,但

    List<User> list = The list where i get my data
    List<User> listTemp = list.stream()
            .sorted(Comparator.comparing(User::getDate))
            .collect(Collectors.toList());
    

    • 8/24/2012

    • 5/22/14

    • 4/20/12
    • 10/11/12

    7 回复  |  直到 7 年前
        1
  •  2
  •   Mershel    7 年前

    尝试以下方法:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
    List<User> listTemp = list .stream()
                .sorted((u1, u2) -> LocalDate.parse(u1.getDate(), formatter).compareTo(LocalDate.parse(u2.getDate(), formatter)))
                .collect(Collectors.toList());
    
        2
  •  1
  •   Schidu Luca    7 年前

    通常在这种情况下,最好转换为 String Date

    List<User> listTemp = list.stream()
                .sorted(Comparator.comparing(u -> {
                    String[] s = u.getDate().split("-");
                    return s[2] + s[1] + s[0];
                }))
                .collect(Collectors.toList());
    

    显然,我不建议在实际项目中使用它

        3
  •  1
  •   ETO    7 年前

    String - Date 在这里转换。您需要的是一个能够处理自定义格式的自定义比较器:

    Comparator.comapring .thenComparing 方法。它们允许您执行连续比较。

    假设您的格式是 mm/dd/yyyy 以下剪掉的部分就可以了。它将比较 yyyy mm dd :

    final String delimiter = "/";
    list.stream()
        .sorted((user1, user2) -> {
            String[] date1 = user1.getDate().split(delimiter);
            String[] date2 = user2.getDate().split(delimiter);
            return Comparator.comparing((String[] arr) -> arr[2])
                             .thenComparing(arr -> arr[0])
                             .thenComparing(arr -> arr[1])
                             .compare(date1, date2);
        })
        .collect(Collectors.toList());
    

    Function<User, String[]> splitDate = u -> u.getDate().split("/");
    list.stream()
        .sorted((u1, u2) -> Comparator.comparing((String[] arr) -> arr[2])
                                      .thenComparing(arr -> arr[0])
                                      .thenComparing(arr -> arr[1])
                                      .compare(splitDate.apply(u1), splitDate.apply(u2)))
        .collect(Collectors.toList());
    
        4
  •  0
  •   PumpkinBreath    7 年前

    您可以在用户类中实现Comparable接口,然后重写compareTo()方法,以便按照需要的顺序对日期进行排序。compareTo()返回一个int值-10或1

        5
  •  0
  •   Dimitris    7 年前

    代码不起作用的原因是当前正在比较字符串。字符串比较器不是用来比较日期的,我希望按照字母顺序排序,或者沿着这条线排序。

    如果确实无法将字符串解析为日期,则需要通过字符串操作或正则表达式提取字符串的日期部分。然后需要将它们转换为数字。然后,您必须在类中实现comparator,并使用生成的数字在comparator中按照您的意愿进行排序。

    总的来说,我会尝试找到一种将字符串转换为日期的方法,这对我来说似乎是一个更干净的解决方案。

        6
  •  0
  •   JMD    7 年前

    请在下面查找工作代码:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
        User2 u1 = new User2("User1","08-11-2018");
        User2 u2 = new User2("User2","09-11-2018");
        List<User2> userList = new ArrayList<User2>();
        userList.add(u2);
        userList.add(u1);
        List<User2> listTemp = userList .stream()
                    .sorted((x, y) -> LocalDate.parse(x.getDate(), formatter).compareTo(LocalDate.parse(y.getDate(), formatter)))
                    .collect(Collectors.toList());
    
        listTemp.forEach(user -> {
            System.out.println(user);
        });
    
        7
  •  0
  •   malvern dongeni    7 年前
     List<User> user = list.stream().
                            sorted(comparing(User::getName).
                                  thenComparing(User::getName)).
                                     collect(Collectors.toList());
    

    Abc 03-24-2011

    Abc 03-19-2011

    Abc 03-21-2011

    这将使您清楚地了解排序是如何完成的。

    名称->年份->月份->日期

    供参考 溪流 流动 不是你的 对象