【问题标题】:How to reorder the below list data如何重新排序以下列表数据
【发布时间】:2014-07-29 01:43:25
【问题描述】:

我将有一个包含日期的列表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]

【问题讨论】:

  • 您按照数组元素的自然顺序对其进行了排序。

标签: java sorting collections


【解决方案1】:

基本上,您当前的列表按“文本自然”顺序排序,不会像您预期的那样对数字(或日期)进行排序。相反,您需要提供一个自定义的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)

【讨论】:

  • 非常感谢,它唤醒了我。当然我会检查上面的集合类型。
  • @developer 这本质上是一个基于 vandale 答案的示例,因此,如果您觉得它有用,我们将表示赞赏,但应该归功于 vandale,因为他首先回应...恕我直言
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您可以使用比较器并使用字符串的前 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]
    

    【讨论】:

    • 这可能只是个人的事情,但要注意将“日期”值转换为 int 进行比较,它可能并不总是按您期望的方式工作...
    • @MadProgrammer 只要最后 4 个字符是年份,前 2 个字符是月份,它就可以工作。
    • “只要” - 著名的遗言;)
    • @MadProgrammer ahahaha :))
    【解决方案4】:

    目前mmyyyyy 被分类为简单的String

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

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

    【讨论】:

      猜你喜欢
      • 2014-02-02
      • 2020-02-24
      • 2019-07-09
      • 1970-01-01
      • 2019-03-20
      • 2017-10-16
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      相关资源
      最近更新 更多