นี่อาจเป็นการตอบสนองแบบเก่า แต่ฉันใช้ตัวอย่างจากโพสต์นี้เพื่อสร้างเครื่องมือเปรียบเทียบที่จะเรียงลำดับArrayList
ของHashMap<String, String>
โดยวัตถุหนึ่งในรายการว่าการประทับเวลา
ฉันมีวัตถุเหล่านี้:
ArrayList<Map<String, String>> alList = new ArrayList<Map<String, String>>();
วัตถุแผนที่มีดังนี้:
Map<String, Object> map = new HashMap<>();
// of course this is the actual formatted date below in the timestamp
map.put("timestamp", "MM/dd/yyyy HH:mm:ss");
map.put("item1", "my text goes here");
map.put("item2", "my text goes here");
การแมปนั้นเป็นสิ่งที่ฉันใช้เพื่อโหลดวัตถุทั้งหมดของฉันลงในรายการอาร์เรย์โดยใช้alList.add(map)
ฟังก์ชั่นภายในลูป
ตอนนี้ฉันสร้างตัวเปรียบเทียบของฉันเอง:
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
public class DateSorter implements Comparator {
public int compare(Object firstObjToCompare, Object secondObjToCompare) {
String firstDateString = ((HashMap<String, String>) firstObjToCompare).get("timestamp");
String secondDateString = ((HashMap<String, String>) secondObjToCompare).get("timestamp");
if (secondDateString == null || firstDateString == null) {
return 0;
}
// Convert to Dates
DateTimeFormatter dtf = DateTimeFormat.forPattern("MM/dd/yyyy HH:mm:ss");
DateTime firstDate = dtf.parseDateTime(firstDateString);
DateTime secondDate = dtf.parseDateTime(secondDateString);
if (firstDate.isAfter(secondDate)) return -1;
else if (firstDate.isBefore(secondDate)) return 1;
else return 0;
}
}
ตอนนี้ฉันสามารถโทร Comparator เมื่อใดก็ได้ในอาเรย์และมันจะเรียงลำดับอาเรย์ของฉันให้ฉัน timestamp ล่าสุดในตำแหน่ง 0 (ด้านบนของรายการ) และเวลาที่เร็วที่สุดในตอนท้ายของรายการ โพสต์ใหม่จะถูกนำไปด้านบนโดยทั่วไป
Collections.sort(alList, new DateSorter());
นี่อาจช่วยให้ใครบางคนออกมาซึ่งเป็นสาเหตุที่ฉันโพสต์ไว้ คำนึงถึงคำสั่ง return ภายในฟังก์ชั่น compar () ผลลัพธ์มี 3 ประเภท ส่งกลับ 0 ถ้าพวกเขามีค่าเท่ากันกลับ> 0 ถ้าวันแรกอยู่ก่อนวันที่สองและกลับมา <0 ถ้าวันแรกคือหลังจากวันที่สอง หากคุณต้องการให้รายการของคุณกลับรายการเพียงแค่สลับคำสั่งส่งคืนทั้งสองนั้น! Simple =]