java字符串数组排序

java字符串数组排序,java,sorting,Java,Sorting,我必须按日期对数组列表进行排序。我不知道怎么做,所以我将所有值添加到一个值中。这几乎可以正常工作,但不太好这是我的代码: ArrayList<String> ar = new ArrayList<String>(); String s1 ="2016|07|21 15:26:20!947!-0.0091002"; String s2 ="2015|08|21 15:26:20!977!0.0091002"; String s

我必须按日期对数组列表进行排序。我不知道怎么做,所以我将所有值添加到一个值中。这几乎可以正常工作,但不太好这是我的代码:

ArrayList<String> ar = new ArrayList<String>();
        String s1 ="2016|07|21 15:26:20!947!-0.0091002";
        String s2 ="2015|08|21 15:26:20!977!0.0091002";
        String s3 ="2015|07|22 15:26:20!947!1.0091002";
        String s4 ="2015|07|21 16:26:20!946!0.0091001";
        String s5 ="2015|07|21 15:27:20!977!0.0091002";
        String s6 ="2015|07|21 15:26:21!947!1.0091002";
        String s7 ="2015|07|21 15:26:20!946!0.0091001";
        ar.add(s1);
        ar.add(s2);
        ar.add(s3);
        ar.add(s4);
        ar.add(s5);
        ar.add(s6);
        ar.add(s7);
        Collections.sort(ar.subList(1, ar.size()));
        Object[][] data = {
                {ar.get(0)},
                {ar.get(1)},
                {ar.get(2)},
                {ar.get(3)},
                {ar.get(4)},
                {ar.get(5)},
                {ar.get(6)},
        };
但这正是我需要的:

2015|07|21 15:26:20!946!0.0091001
2015|07|21 15:26:21!947!1.0091002
2015|07|21 15:27:20!977!0.0091002
2015|07|21 16:26:20!946!0.0091001
2015|07|22 15:26:20!947!1.0091002
2015|08|21 15:26:20!977!0.0091002
2016|07|21 15:26:20!947!-0.0091002

我没有ida为什么会发生这种情况?您只对列表子列表的一个视图进行排序,这对实际要返回的列表没有影响。实际上,List.sublist返回一个新列表

顺便说一下,您的代码可能要短得多:

List<String> list = Arrays.asList(
    "2016|07|21 15:26:20!947!-0.0091002", "2015|08|21 15:26:20!977!0.0091002", "2015|07|22 15:26:20!947!1.0091002",
    "2015|07|21 16:26:20!946!0.0091001", "2015|07|21 15:27:20!977!0.0091002", "2015|07|21 15:26:21!947!1.0091002", "2015|07|21 15:26:20!946!0.0091001");
Collections.sort(list);
只需使用:

Collections.sort(ar);
对整个列表进行排序

请记住,Java列表是基于零的,因此ar.get0是第一个元素。List.subListi,j将子列表从i(包含)返回到j(独占)


因此,要通过子列表对整个列表进行排序,需要使用i=0和j=ar.size。但是,子列表的间接定向是不必要的:只需将列表本身传递给Collections.sort。

下面是代码的错误

    Collections.sort(ar.subList(1, ar.size()));
您正在尝试对索引1~N排序,因此索引0未排序

您应该这样对整个ArrayList进行排序

    Collections.sort(ar);
这将按升序对ArrayList进行排序

输出


但是,您的代码只是按升序对字符串列表进行排序,因此如果月份/日期/年份的顺序不同,则不会按时间进行排序。您应该使用Java或其他库(如Apache)中提供的日期/时间UTIL。

Collection.sortar.sabList0,ar size?不真实的对ArrayList的子列表进行排序,至少会更新原始列表。@AndyTurner哦,对了,它不是新列表。然而,我看了一下文档,发现只反映了非结构性的修改。还有一点:结构修改是指那些改变列表大小的修改,或者以某种方式干扰列表,使得正在进行的迭代可能产生错误的结果。排序与第二种情况无关吗?正在进行哪些迭代?你是说在OP的代码中?这不是问题,这是一个定义,而不是适用于特定案例的东西。我不确定排序是一种结构修改,但看到这个定义,我并不觉得荒谬。如果我想在一个地方添加所有值,我会使用'String[]ar={…}'有点离题,有必要将这些字符串转换为日期,并使用自定义比较器将其排序为日期?还是最好将它们作为字符串保存?这取决于一旦它们被排序后,您将如何处理它们。如果你只是把它们打印出来,那没什么区别。如果你正在做其他需要它们作为日期的事情,请将它们作为日期保存。因为Date实现了Comparable,所以您不需要自定义比较器。
    Collections.sort(ar);
2015|07|21 15:26:20!946!0.0091001
2015|07|21 15:26:21!947!1.0091002
2015|07|21 15:27:20!977!0.0091002
2015|07|21 16:26:20!946!0.0091001
2015|07|22 15:26:20!947!1.0091002
2015|08|21 15:26:20!977!0.0091002
2016|07|21 15:26:20!947!-0.0091002