如何重新排序以下列表数据

时间:2014-07-29 01:43:25

标签: java sorting collections

我将有一个以这种方式包含日期的列表mm/YYYY。我需要重新排序列表中的数据。

首先:

在列表中,我将有数据如下

        yearList.add("042011");
        yearList.add("052011");
        yearList.add("062011");
        yearList.add("072011");
        yearList.add("082011");
        yearList.add("092011");
        yearList.add("102010");
        yearList.add("112010");
        yearList.add("122010");
        yearList.add("012011");
        yearList.add("022011");
        yearList.add("032011");

我使用了Collections.sort(yearList);但是输出结果给了我

[012011, 022011, 032011, 042011, 052011, 062011, 072011, 082011, 092011, 102010, 112010, 122010]

但我需要输出如下。

  

[102010,112010,122010,012011,022011,032011,042011,052011,   062011,072011,082011,092011]

4 个答案:

答案 0 :(得分:3)

基本上,您当前的列表已按“文本自然”顺序排序,不会按预期排序数字(或日期)。相反,您需要提供自定义Comparator来更改排序的工作方式,例如

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class SortList {

    public static void main(String[] args) {
        List<String> yearList = new ArrayList<>(25);
        yearList.add("042011");
        yearList.add("052011");
        yearList.add("062011");
        yearList.add("072011");
        yearList.add("082011");
        yearList.add("092011");
        yearList.add("102010");
        yearList.add("112010");
        yearList.add("122010");
        yearList.add("012011");
        yearList.add("022011");
        yearList.add("032011");

        Collections.sort(yearList, new Comparator<String>() {
            private DateFormat format = new SimpleDateFormat("MMyyyy");

            @Override
            public int compare(String o1, String o2) {
                int result = 0;
                try {
                    Date d1 = format.parse(o1);
                    try {
                        Date d2 = format.parse(o2);
                        result = d1.compareTo(d2);
                    } catch (ParseException ex) {
                        result = -1;
                    }
                } catch (ParseException ex) {
                    result = 1;
                }
                return result;
            }
        });
        System.out.println(yearList);
    }

}

哪个输出[102010, 112010, 122010, 012011, 022011, 032011, 042011, 052011, 062011, 072011, 082011, 092011]

仔细查看`Collections.sort(List, Comparator)

答案 1 :(得分:2)

您可以改为使用Collections.sort(List, Comparator)表单并将其传递给自定义Comparator,并考虑字符串的格式

答案 2 :(得分:2)

您可以使用比较器并使用字符串的前2个字符并将其解析为int

<强>样品:

Collections.sort(yearList, new Comparator<String>() {

        @Override
        public int compare(String s1, String s2) {
            if(Integer.parseInt(s1.substring(2, 6)) == Integer.parseInt(s2.substring(2, 6)))
               return Integer.parseInt(s1.substring(0, 2)) - Integer.parseInt(s1.substring(0,2));
            else
                return Integer.parseInt(s1.substring(2, 6)) - Integer.parseInt(s2.substring(2, 6));
        }
    });

    System.out.println(yearList.toString());

<强>结果:

   [102010, 112010, 122010, 012011, 022011, 032011, 042011, 052011, 062011, 072011, 082011, 092011]

答案 3 :(得分:1)

目前,mmyyyyy被归类为简单的String

如果您使用此方法http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#sort(java.util.List,%20java.util.Comparator),则可以提供自己的比较方法。

在此方法中,您需要拆分mmyyyy并将其放入int变量,以便根据您的要求进行排序。