如何根据 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】:
与其处理将Array
或Strings
放在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<T> 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 格式给出的日期?的主要内容,如果未能解决你的问题,请参考以下文章