2016-07-05 225 views
0

在我的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} 

我不知道如何做到这一点。

+0

对于初学者,您正在尝试做2件事。对数组进行排序,并从子数组中提取一个信息。 – njzk2

+0

而那不可能?在一个总监?因为那不是比较者所做的事情,所以我总是可以在排序之后提取姓名 – Mischa

+0

。你需要先排序,然后提取你需要的值 – njzk2

回答

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)); 
} 
+0

我试图实现这个,但问题是o1和o2被定义为数组中的第一项,所以它试图比较名称而不是日期。我需要改变以解决这个问题? – Mischa

+0

Nop ... o1 [1]和o2 [1]是字符串中的元素2(在索引1处).... –

+0

没关系,那是不正确的。 – Mischa

1

这似乎是你在找什么:java Arrays.sort 2d array

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

0

java.time

accepted answer是正确的,但使用过时的类作为问题。 java.util.Date类被嵌入到Java 8及更高版本中的java.time框架所取代。这些课程取代了旧的麻烦日期时间课程,如java.util.Date。见Oracle Tutorial。许多功能已被移植到ThreeTen-Backport中的Java中,并进一步适用于Android中的ThreeTenABP

使用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

相关问题