使用java8的排序列表[重复]

Posted

技术标签:

【中文标题】使用java8的排序列表[重复]【英文标题】:sorting list of using java8 [duplicate] 【发布时间】:2020-08-28 01:36:51 【问题描述】:

我有一个类似ArrayList<DateFrequency>的列表

private static ArrayList<DateFrequency> getUnsortedDateFrequencyList() 

    ArrayList<DateFrequency> list = new ArrayList<>();
    list.add( new DateFrequency(05/10/2020, "60-DAYS") );
    list.add( new DateFrequency(05/10/2020, "30-DAYS") );
    list.add( new DateFrequency(05/11/2020, "30-DAYS") );
    list.add( new DateFrequency(05/12/2020, "60-DAYS") );
    list.add( new DateFrequency(05/11/2020, "90-DAYS") );

我需要排序列表

05/10/2020, "30-DAYS"
05/10/2020, "60-DAYS"
05/11/2020, "30-DAYS"
05/11/2020, "90-DAYS"
05/12/2020, "60-DAYS"

【问题讨论】:

尝试使用比较器。 解决方案取决于DateFrequency是什么。 很基本的东西已经在很多地方解释过了。在要求获得好答案之前进行搜索,比任何人都可以在这里输入新答案更快。 I downvoted because research must be done to ask a good question. 不要将日期和频率作为字符串保存在对象中。使用LocalDate 作为日期,使用int 或一些枚举类型作为频率;你也可以考虑Period。当您需要呈现数据时,您始终可以以用户友好的方式格式化数据。 【参考方案1】:

您可以使用 java 8 流来实现,如下所示。

List<String> sortedList = list.stream().sorted().collect(Collectors.toList());

【讨论】:

问题不在于字符串列表。 我没有收到像 05/10/2020、“30-DAYS”这样的订单 05/10/2020、“60-DAYS” 05/ 2020 年 11 月,“30 天” 2020 年 5 月 11 日,“90 天” 2020 年 5 月 12 日,“60 天” @SubrahmanyamGuntupalli - 我假设记录只需要按日期排序,而不是按频率排序。这是正确的假设吗?【参考方案2】:
    使用DateTimeFormatter 创建所需的模式,以便您可以将日期字符串解析为LocalDate。 使用Comparator 比较解析日期字符串上的DateFrequency 对象。

演示:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

class DateFrequency 
    private String date;
    private String frequency;

    public DateFrequency(String date, String frequency) 
        this.date = date;
        this.frequency = frequency;
    

    public String getDate() 
        return date;
    

    @Override
    public String toString() 
        return "DateFrequency [date=" + date + ", frequency=" + frequency + "]";
    


public class Main 
    public static void main(String[] args) 
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");

        List<DateFrequency> list = new ArrayList<DateFrequency>();
        list.add(new DateFrequency("05/10/2020", "60-DAYS"));
        list.add(new DateFrequency("05/10/2020", "30-DAYS"));
        list.add(new DateFrequency("05/11/2020", "30-DAYS"));
        list.add(new DateFrequency("05/12/2020", "60-DAYS"));
        list.add(new DateFrequency("05/11/2020", "90-DAYS"));

        // Sort on dates in ascending order
        Collections.sort(list, Comparator.comparing((df) -> LocalDate.parse(df.getDate(), formatter)));

        // Display the sorted result
        for (DateFrequency df : list) 
            System.out.println(df);
        
    

输出:

DateFrequency [date=05/10/2020, frequency=60-DAYS]
DateFrequency [date=05/10/2020, frequency=30-DAYS]
DateFrequency [date=05/11/2020, frequency=30-DAYS]
DateFrequency [date=05/11/2020, frequency=90-DAYS]
DateFrequency [date=05/12/2020, frequency=60-DAYS]

假设:

    日期字符串的格式为dd/MM/yyyy。如果没有,请在对象中相应地更改它,formatter。 仅需要按升序对日期进行排序。

【讨论】:

我需要按频率和日期列出顺序

以上是关于使用java8的排序列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Java8流将列表列表转换为单个列表[重复]

Java8使用Stream流实现List列表的查询统计排序分组

JAVA8:将对象列表映射到String [] [重复]

计算单词的频率和java8中列表的返回列表[重复]

带有集合或列表的 Java 8 CompletableFuture.allOf(...) [重复]

Java 8列表副本[重复]