我已经声明了一个ArrayList,如下所示:
ArrayList<HashMap<String, String>> oslist = new ArrayList<HashMap<String, String>>();
oslist的每个元素都包含5个Hashmaps:
HashMap<String, String> map = new HashMap<String, String>();
map.put(string, string);
map.put(string, string);
map.put(string, string);
map.put(string, string);
map.put(string, string);
其中一个是以下格式的日期:“yyyy-MM-dd'T'HH:mm:ss.SSS'Z'”
现在我写了这个类来对这个日期格式进行排序。类及其用法如下:
DateObject.java
package com.test;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class DateObject implements Comparable<Object> {
private String date;
private String time;
public DateObject(String dates) {
try {
Date date_for = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
Locale.ENGLISH).parse(dates);
String date_upd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH)
.format(date_for);
//System.out.println(date_upd);
String[] parts = date_upd.split(" ");
this.date = parts[0];
this.time = parts[1];
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public int compareTo(Object o) {
DateFormat formatter;
Date date1 = null;
Date date2 = null;
formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
date1 = (Date) formatter.parse(this.date + " " + this.time);
DateObject other = (DateObject) o;
date2 = (Date) formatter.parse(other.date + " " + other.time);
} catch (ParseException e) {
e.printStackTrace();
}
catch(NullPointerException npe){
System.out.println("Exception thrown "+npe.getMessage()+" date1 is "+date1+" date2 is "+date2);
}
return date2.compareTo(date1);
}
@Override
public String toString(){
return this.date+" "+this.time;
}
}
Test.java
package com.test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<DateObject> list = new ArrayList<DateObject>();
;
DateObject d1 = new DateObject("2012-12-05T11:20:19.111Z");
list.add(d1);
d1 = new DateObject("2012-12-05T11:20:19.111Z");
list.add(d1);
d1 = new DateObject("2012-12-04T10:20:19.111Z");
list.add(d1);
d1 = new DateObject("2010-12-07T13:20:19.111Z");
list.add(d1);
d1 = new DateObject("2012-12-05T11:20:19.111Z");
list.add(d1);
Collections.sort(list);
for(DateObject d : list){
System.out.println(d);
}
}
// "yyyy-MM-dd HH:mm:ss
}
我的问题是如何使用此类对我的oslist进行排序?那是当我根据日期HashMap对oslist进行排序时,我的其他HashMaps也会相应地进行排序。有一点需要注意的是,oslist日期将存储为String,因此我无法直接使用sort。感谢。
答案 0 :(得分:1)
您的Comparable
实施是错误的,应该是:
public class DateObject implements Comparable<DateObject> {
...
@Override
public int compareTo(DateObject o) {
...
}
}
如果您要整理map
条目(默认情况下不是Comparable
),则必须使用特定的Comparator
:
Collections.sort(oslist.entrySet(), new Comparator<Map.Entry<String,String>>() {
...
});
但是我不能建议你这样做,因为我不知道你的地图是什么(所有都是字符串?!)。
TreeMap
也可能有用,因为它按键排序。
答案 1 :(得分:0)
不确定我是否正确理解了这个问题...您想要对哈希映射列表进行排序,并且在每个哈希映射中都有一个带有此Date对象的条目?如果是这样,您可以使用java.util.Collections.sort
Collections.sort(listOfHashMaps, new Comparator<HashMap>() {
@Override
public int compare(final HashMapo1, final HashMap o2) {
final String dateObject1 = o1.get("dateObjectKey");
final String dateObject2 = o2.get("dateObjectKey");
//parse the date objects compare and return result...
}
})
答案 2 :(得分:0)
如果您需要对对象的地图列表进行排序,那么您需要编写比较器,以便将对象地图与另一个地图进行比较
ArrayList<HashMap<String, String>> oslist = new ArrayList<HashMap<String, String>>();
Collections.sort(oslist, new Comparator<HashMap<String, String>>(){
@Override
public int compare(HashMap<String, String> o1, HashMap<String, String> o2) {
//implement your sorting logic here
};
});
两个HashMaps之间没有内在的顺序。两个TreeMaps之间都没有(尽管TreeMap中的对象,如果有办法将它们相互比较,它们将被排序)。
您可以在此函数中重用Comparable DateObject,但请记住,您还必须对Collections.sort()说如何将一个HashMap与另一个HashMap进行比较。
答案 3 :(得分:0)
TreeSet
由自定义&#34; Comparator&#34;进行自然排序。所以不使用String的compareTo()
,但是你不能添加空值而不是重复值(但是带有comperae = 0的值)。
即
public class StringTypeDateTimeComparator extends Comparable<String>{
public int compare(String o1, String o2){
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(o1)
.compareTo(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(o2));
}
}
TreeSet<String> ts = new TreeSet<String>(new StringTypeDateTimeComparator());
ts.add("2012-12-01T11:20:19.111Z");
ts.add("2012-12-20T11:20:19.111Z");
为什么我会将SimpleDateFormat两次实例化?它不是Thread-Save。