【问题标题】:sorting list of using java8 [duplicate]使用java8的排序列表[重复]
【发布时间】: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。当您需要呈现数据时,您始终可以以用户友好的方式格式化数据。

标签: java java-8


【解决方案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】:
  1. 使用DateTimeFormatter 创建所需的模式,以便您可以将日期字符串解析为LocalDate
  2. 使用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]

假设:

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

【讨论】:

  • 我需要按频率和日期列出顺序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 2019-09-18
  • 1970-01-01
  • 2018-11-21
  • 1970-01-01
相关资源
最近更新 更多