我有一个Hashmap数组,每个hashmap包含 24小时时间作为键值对。
我想按时间的升序排序这个数组。我怎么能做到这一点?
这是我的代码片段:
HashMap[] arr = new HashMap[100];
for(int i=0;i<100;i++) {
HashMap<String,String> child=new HashMap<String,String>();
child.put("some_time","21:09"); //time changes per iteration(time is in 24-hour format)
arr[i]=child;
}
答案 0 :(得分:2)
您可以使用Arrays.sort(T[], Comparator<T>)
。这允许您传递任何类型的数组并编写自己的自定义比较器方法,如下所示:
Arrays.sort(arr, new Comparator<HashMap>() {
public int compare(HashMap o1, HashMap o2) {
// Compare values you're interested in and return int as specified by Comparator API
}
});
有关返回内容的详细信息,请参阅the API。
答案 1 :(得分:1)
在继续这种方法之前,请考虑一下注释并确定是否是正确的方法。如果我正如我所指出的那样,你有一堆地图,每个地图都包含大量信息,其中一个条目是你的日期,那么这可能是正确的做法,在这种情况下,对数组进行排序的最简单方法是使用Arrays.sort
方法:
HashMap[] arr=new Hashmap[100];
for(int i=0;i<100;i++){
HashMap<String,String> child=new HashMap<String,String>();
... // put all the info into the HashMap
child.put("some_time","21:09"); //time changes per iteration(time is in 24-hour format)
arr[i]=child;
}
Arrays.sort(arr, new Comparator<HashMap>() {
public int compare(HashMap o1, HashMap o2) {
String d1 = o1.get("some_time");
String d2 = o2.get("some_time");
//compare the two dates. If you're always in the same format, e.g. HH:MM (24 hours, two-digit hour, two-digit year), you might even be able to simply compare strings:
return d1.compareTo(d2);
}
});
答案 2 :(得分:1)
以下是按时间排序数组的完整代码,格式为hh:mm
:
HashMap<String,String>[] harr = new HashMap[10];
final DateFormat df = new SimpleDateFormat("kk:mm");
// prepare your data
for(int i=0;i<harr.length;i++) {
HashMap<String,String> child=new HashMap<String,String>();
int ss = (int)(Math.random() * (59 + 1));
//time changes per iteration(time is in 24-hour format)
child.put("some_time", String.format("21:%02d", ss));
harr[i]=child;
}
System.out.printf("map array is: %s%n", Arrays.deepToString(harr));
// now apply sort using a custom method
Arrays.sort(harr, new Comparator<HashMap<String,String>>() {
public int compare(HashMap<String,String> o1, HashMap<String,String> o2) {
String t1 = o1.get("some_time");
String t2 = o2.get("some_time");
try {
Date dt1 = df.parse(t1);
Date dt2 = df.parse(t2);
return dt1.compareTo(dt2);
} catch (ParseException e) {
e.printStackTrace();
}
return 0;
}
});
System.out.printf("sorted map array is: %s%n", Arrays.deepToString(harr));
答案 3 :(得分:0)
正如Bhavik指出的那样,你可能没有使用JDK充分发挥它的潜力 - 看看SortedMap这可能就是你正在寻找的东西;可能你自己实现了Comparator。
SortedMap arr = new TreeMap<String,HashMap<String,String>>();
for ( int i=0 ; i<100 ; i++ )
{
Map<String,String> child = HashMap<String,String>();
child.put( "some_time" , "21:09" );
arr.put( "21:09" , child );
}
然后您可以使用arr.values().iterator()
来获取已排序的child
人。
干杯,
答案 4 :(得分:0)
一般方法是编写Comparator
以根据密钥对一对HashMap
对象进行排序,然后将其作为参数传递给Arrays.sort(T[], Comparator<T>)
方法。
比较器看起来像这样:
Comparator<HashMap> DATE_ORDER = new Comparator<HashMap>() {
public int compare(Comparator<HashMap>h1, Comparator<HashMap>h2) {
String time1 = h1.get("some_time");
String time2 = h2.get("some_time");
return time1.compareTo(time2); // assuming that the time strings
// can be ordered that way
}
};
话虽如此,你的问题有“尝试使用地图”的气味,因为他们应该真正编写自定义类。