Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何对下面的列表数据重新排序_Java_Sorting_Collections - Fatal编程技术网

Java 如何对下面的列表数据重新排序

Java 如何对下面的列表数据重新排序,java,sorting,collections,Java,Sorting,Collections,我将有一个以这种方式包含日期的列表mm/YYYY。我需要对列表中的数据重新排序 第一名: Collections.sort(yearList, new Comparator<String>() { @Override public int compare(String s1, String s2) { if(Integer.parseInt(s1.substring(2, 6)) == Integer.parseInt(s2.

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

第一名:

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]
在列表中,我将有如下数据

        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(年表)但是out给了我一个

[012011, 022011, 032011, 042011, 052011, 062011, 072011, 082011, 092011, 102010, 112010, 122010]
但我需要如下输出

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


您可以改为使用表单,并向其传递一个将考虑字符串格式的自定义项

您可以改为使用表单,并在
mmyyyy
被排序为简单的
字符串时向其传递一个将考虑字符串格式的自定义项

如果您使用此方法,您可以提供自己的方法进行比较


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

此时
mmyyyy
被排序为一个简单的
字符串

如果您使用此方法,您可以提供自己的方法进行比较


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

您可以使用comparator,使用字符串的前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]

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

基本上,您当前的列表是按“文本自然”顺序排序的,这不会像您预期的那样对数字(或日期)进行排序。相反,您需要提供一个自定义的
比较器来更改排序的工作方式,例如

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

}
导入java.text.DateFormat;
导入java.text.ParseException;
导入java.text.simpleDataFormat;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.Comparator;
导入java.util.Date;
导入java.util.List;
导入java.util.logging.Level;
导入java.util.logging.Logger;
公共类分类表{
公共静态void main(字符串[]args){
列表年表=新阵列列表(25);
年鉴。添加(“2011年4月4日”);
年鉴。添加(“2011年5月5日”);
年鉴。添加(“062011”);
年鉴。添加(“072011”);
年鉴。添加(“2011年8月”);
年鉴。添加(“092011”);
年鉴。添加(“102010”);
年鉴。添加(“112010”);
年鉴。添加(“122010”);
年鉴。添加(“012011”);
年鉴。添加(“022011”);
年鉴。添加(“032011”);
Collections.sort(年表,新的比较器(){
专用日期格式=新的SimpleDataFormat(“MMyyyy”);
@凌驾
公共整数比较(字符串o1、字符串o2){
int结果=0;
试一试{
日期d1=format.parse(o1);
试一试{
日期d2=格式解析(o2);
结果=d1。与(d2)相比;
}捕获(解析异常){
结果=-1;
}
}捕获(解析异常){
结果=1;
}
返回结果;
}
});
系统输出打印LN(年表);
}
}
其输出
[102010、112010、122010、012011、022011、032011、042011、052011、062011、072011、082011、092011]


仔细看一下

基本上,您当前的列表是按“文本自然”顺序排序的,这不会像您预期的那样对数字(或日期)进行排序。相反,您需要提供一个自定义的
比较器来更改排序的工作方式,例如

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

}
导入java.text.DateFormat;
导入java.text.ParseException;
导入java.text.simpleDataFormat;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.Comparator;
导入java.util.Date;
导入java.util.List;
导入java.util.logging.Level;
导入java.util.logging.Logger;
公共类分类表{
公共静态void main(字符串[]args){
列表年表=新阵列列表(25);
年鉴。添加(“2011年4月4日”);
年鉴。添加(“2011年5月5日”);
年鉴。添加(“062011”);
年鉴。添加(“072011”);
年鉴。添加(“2011年8月”);
年鉴。添加(“092011”);
年鉴。添加(“102010”);
年鉴。添加(“112010”);
年鉴。添加(“122010”);
年鉴。添加(“012011”);
年鉴。添加(“022011”);
年鉴。添加(“032011”);
Collections.sort(年表,新的比较器(){
专用日期格式=新的SimpleDataFormat(“MMyyyy”);
@凌驾
公共整数比较(字符串o1、字符串o2){
int结果=0;
试一试{
日期d1=format.parse(o1);
试一试{
日期d2=格式解析(o2);
结果=d1。与(d2)相比;
}捕获(解析异常){
结果=-1;
}
}捕获(解析异常){
结果=1;
}
返回结果;
}
});
系统输出打印LN(年表);
}
}
其输出
[102010、112010、122010、012011、022011、032011、042011、052011、062011、072011、082011、092011]


仔细看看

你按自然顺序对数组元素进行了排序。你按自然顺序对数组元素进行了排序。非常感谢,我很惊讶。当然,我会检查上面的集合类型。@developer这基本上是一个基于vandale答案的示例,因此如果您觉得它有用,请投赞成票,但应归功于vandale,因为他首先作出了回应……IMHOThanks非常感谢,我很惊讶。当然,我会检查上面的Coll