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