【问题标题】:How to sort an array of arrays by date?如何按日期对数组进行排序?
【发布时间】:2016-11-07 16:19:46
【问题描述】:

在我的 android 应用程序中,我试图获得一个排序数组。我有一个包含名称字符串和日期字符串的数组数组。我正在尝试根据日期对名称进行排序。像这样:

private void sortList() {
    String[][] namesAndDatesList = new String[][] {
                new String[] {"name1", "05/03/2016 02:11:33")}
            ,   new String[] {"name2", "04/03/2016 02:11:34"}
            ,   new String[] {"name3", "04/03/2016 02:11:33")}
            ,   new String[] {"name4", "02/03/2016 02:11:33")}
            ,   new String[] {"name5", "05/03/2016 02:11:38")}
    };

    String[] namesList = Collections.sort(namesAndDatesList, new StringDateComparator());

}

class StringDateComparator implements Comparator<String>
{
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
    public int compare(params)
    {
        try {
            // return something
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return 0;
    }
}

我希望它输出按日期和时间排序的名称,例如:

namesList = {name4, name3, name2, name1, name5}

我不知道该怎么做。

【问题讨论】:

  • 对于初学者,您正在尝试做两件事。对数组进行排序,从子数组中提取一个信息。
  • 那不可能?在一个比较器中?我当然总是可以在排序后提取名称
  • 不,因为这不是比较器的作用。您确实需要先排序,然后提取您需要的值

标签: java android arrays


【解决方案1】:

java.time

accepted answer 是正确的,但与问题一样使用过时的类。 java.util.Date 类被 Java 8 及更高版本中内置的 java.time 框架所取代。这些类取代了旧的麻烦的日期时间类,例如java.util.Date。见Oracle Tutorial。大部分功能已在 ThreeTen-Backport 中向后移植到 Java 6 和 7,并在 ThreeTenABP 中进一步适应 Android。

使用java.util.Date 类的代码意味着数据输入位于UTC 时区。但是我们不能仅根据给定的数据做出这个假设。所以更合适的是LocalDateTime 类,它故意缺少任何offset-from-UTC 或时区信息。

String input = "04/03/2016 02:11:34";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "dd/MM/yyyy HH:mm:ss" );
LocalDateTime ldt = LocalDateTime.parse( input , formatter );

该答案中的其余逻辑保持不变。 LocalDateTime 类实现了compareTo

【讨论】:

    【解决方案2】:

    你应该把字符串解析成一个日期然后比较它,对于android你可以使用Arrays.sort方法并传递一个匿名比较器

    示例:

    private void sort2dArray() {
    String[][] namesAndDatesList = new String[][] { new String[] { "name1", "05/03/2016 02:11:33" },
        new String[] { "name2", "04/03/2016 02:11:34" }, new String[] { "name3", "04/03/2016 02:11:33" },
        new String[] { "name4", "02/03/2016 02:11:33" }, new String[] { "name5", "05/03/2016 02:11:38" } };
    
    Arrays.sort(namesAndDatesList, new Comparator<String[]>() {
    
        @Override
        public int compare(String[] o1, String[] o2) {
    
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        Date d1 = null;
        Date d2 = null;
        try {
            d1 = sdf.parse(o1[1]);
            d2 = sdf.parse(o2[1]);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return d1.compareTo(d2);
        }
    });
    System.out.println(Arrays.deepToString(namesAndDatesList));
    }
    

    【讨论】:

    • 我已经尝试实现这一点,但问题是 o1 和 o2 被定义为数组中的第一项,因此它试图比较名称而不是日期。我需要改变什么来解决这个问题?
    • Nop... o1[1] 和 o2[1] 是字符串中的元素 2(在索引 1 处)......
    • 在实现代码时遇到了一些问题,导致我没有发布问题,但我设法用您的代码修复了这些问题。谢谢!将您的答案标记为正确
    【解决方案3】:

    这似乎就是您要查找的内容:java Arrays.sort 2d array

    或者,您可以创建一个具有两个属性(名称、日期)的自定义类,然后创建一个实现 Comparator 的 CustomClassComparator。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 2021-02-23
      相关资源
      最近更新 更多