如何根据 array[0] 元素对数组的 ArrayList 进行排序,该元素是以 dd/mm/yyyy 格式给出的日期?

Posted

技术标签:

【中文标题】如何根据 array[0] 元素对数组的 ArrayList 进行排序,该元素是以 dd/mm/yyyy 格式给出的日期?【英文标题】:How can I sort an ArrayList of arrays based on the array[0] element which is a date given in dd/mm/yyyy format? 【发布时间】:2020-12-23 06:00:13 【问题描述】:

我有一个小问题,我需要根据数组的第 0 个索引对数组的数组列表进行排序。例如,如果我有一个包含字符串数组的数组列表,例如:

arr1[0] = "12/21/2018" 
arr1[1] = "California"
arr[n] = "some string"

// and I have another array 
arr2[0] = "11/21/2018" 
arr1[1] = "California"
arr[n] = "some string". 

如何根据数组列表中每个数组的第 0 个索引对数组列表进行排序?

【问题讨论】:

你选择了这个数据结构?好吧,你不应该这样做。相反,创建一个包含一堆字段的类,这些字段代表您实际持有的数据。例如,“12/21/2018”必须是某个日期,“California”必须是某个州。 Java 是一种面向对象的语言,因此请直接使用它。 “A”的想法是使用第三个数组来维护原始数组的索引。这样,您对第三个数组进行伪排序,以便sort[0] 将索引存储到其他数组中,这样可以节省很多精力。但是,您将遇到的问题是尝试对String 进行排序。 “更好”的解决方案是将 String 转换为 LocalDate 值,该值具有“比较”的能力 您可以使用 ArrayList.get(index) 获取数组。一旦它返回一个数组,您就可以使用数组上的括号来获取数组中的特定元素。例如,如果您的 ArrayList 被称为 list,则使用 list.get(0)[0] 将返回 ArrayList 中索引 0 处的数组的第一个值。另外,当你想按第一个值排序时,你想按字母、时间顺序等排序吗?如果您按字母顺序排序,您可以使用 String.compareTo() 方法。你最好创建一个自定义类来存储这些数据。这会更有意义。 “我确实选择了这种类型的数据结构” - 所以,我马上建议使用一个类来封装属性,这样维护起来会容易得多 您可能会发现这是一个有用的代码片段,它将不可比较的dd/mm/yyyy 格式转换为自然可比较的yyyymmdd 格式:String yyyymmdd = ddmmyyyy.replaceAll("(..).(..).(.*)", "$3$2$1"); 【参考方案1】:

与其处理将ArrayStrings 放在ArrayList 中,不如直接创建一个具有属性的新类?这个类可以实现Comparable,所以我们可以添加一个自定义比较函数,允许我们以自定义方式对列表进行排序。例如,您的类可以称为 Location,并具有 LocalDate 日期(如 MadProgrammer 所述)和 String 名称。一个例子看起来有点像这样:

class Location implements Comparable<Location> 

// We implement the Comparable so we can Override the compareTo() method and make a custom
// sorting method.

    LocalDate date;
    String name;

    // Add more properties as needed...

    public Location(LocalDate d, String n) 
    // Constructor to help us create the object

        this.date = d;
        this.name = n;

    

// I'm assuming you are comparing the String that was in the first index of the array as
// Dates in chronological order. That way we can compare them easily like so.
    @Override
    public int compareTo(Location other) 

        return this.date.compareTo(other.date);

    



您可以创建Location 类的ArrayList,其定义如下:

List<Location> locs = new ArrayList<>();

然后,您可以使用Collections.sort(List&lt;T&gt; list) 对其进行排序。它使用类中的比较器对其进行排序。


Java 是面向对象的。充分利用它来避免此类棘手的情况。

【讨论】:

啊,是的,这很有意义,当我们完成整个项目时,我将使用这种方法,这很有意义,感谢并帮助我实现了更多! 没问题。面向对象的编程旨在让您摆脱此类情况并使代码更具可读性。【参考方案2】:

像 Pulse 我正在使用 java.time,现代 Java 日期和时间 API:

List<String[]> arraylist = new ArrayList<>();
arraylist.add(new String[]  "12/21/2018", "California", "some string");
arraylist.add(new String[]  "11/21/2018", "California", "some other string");

DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("MM/dd/uuuu");
Comparator<String[]> cmpr = Comparator.comparing(arr -> LocalDate.parse(arr[0], dateFormatter ));
arraylist.sort(cmpr);

arraylist.forEach(arr -> System.out.println(Arrays.toString(arr)));

给出的示例数据的输出是:

[11/21/2018, California, some other string]
[12/21/2018, California, some string]

链接 1:Oracle tutorial: Date Time 解释如何使用 java.time。链接 2:Answer by Pulse。

【讨论】:

【参考方案3】:

当数据按照title时,这里是一个单行,即dd/mm/yyyy

Arrays.sort(arr, comparing(a -> a[0].replaceAll("(..).(..).(.*)", "$3$2$1")));

当数据按照示例时,这是一个单行,即mm/dd/yyyy

Arrays.sort(arr, comparing(a -> a[0].replaceAll("(..).(..).(.*)", "$3$1$2")));

【讨论】:

以上是关于如何根据 array[0] 元素对数组的 ArrayList 进行排序,该元素是以 dd/mm/yyyy 格式给出的日期?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据数组元素的顺序对查询结果进行排序?

如何删除数组中的空元素[重复]

冒泡排序

java实现数组元素反转

如何根据枚举哈希对数组进行排序并返回 Ruby 中的最大值?

PHP 合并两个二维数组 array_map 和 array_walk 的区别