2012-06-20 197 views
0

这是我的第一篇文章。我在二年级的夏季期间担任CS专业的实习和实习。我对Java有很多经验,但比较对象总是给我带来麻烦。用Java对HashTables的ArrayList进行排序

现在我正在编辑一个JSP页面,该页面在日历的不同日期有一堆事件。每个事件都是保存在ArrayList(事件)中的HashMap。我需要对这些事件进行排序。

这是如何添加它们的示例。有很多逻辑,因为许多日期被保存为重复发生日期(即“五月的第一个星期天”)。

convertedDate = convertJulian(rs.getDouble("starting_date")); 
    eventDate = convertedDate.split(","); 
    tempMap.put("id", rs.getString("cal_item_id")); 
    tempMap.put("description", rs.getString("description"));    
    tempMap.put("startingDate", rs.getInt("starting_date"));  
    tempMap.put("resource", rs.getString("resource_name")); 
    tempMap.put("eventMonth", eventDate[0]); 
    tempMap.put("eventDay", eventDate[1]); 
    tempMap.put("eventYear", eventDate[2]); 

    if (!parkYearsList.contains(eventDate[2]) && rs.getDouble("starting_date") >= startDate) { 
     parkYearsList.add(eventDate[2]); 
    } 
    if (rs.getDouble("starting_date") >= startDate)    
     parkEventsList.add(tempMap); 

要对它们进行排序,我尝试过这样做。但它会删除ArrayList中的所有内容?

Collections.sort(parkEventsList, new MapComparator()); 

这是我的比较器和toJulian方法。我没有写出大部分内容,所以有点难以确定哪里会出现问题。

public class MapComparator implements Comparator 
{ 
    public int compare(Object object1 , Object object2) 
    { 

     String date1=(String)((HashMap)object1).get("startingDate"); 
     String date2=(String)((HashMap)object2).get("startingDate"); 

     Double date1Value = toJulian(date1); 
     Double date2Value = toJulian(date2); 

     return date1Value.compareTo(date2Value); 
    } 
} 


public static double toJulian(String ymd) { 
    String[] date = ymd.split(","); 
    int jgreg = 15 + 31*(10+12*1582); 
    int year=Integer.parseInt(date[0]); 
    int month=Integer.parseInt(date[1]); 
    int day=Integer.parseInt(date[2]); 
    int julianYear = year; 
    if (year < 0) julianYear++; 
    int julianMonth = month; 
    if (month > 2) { 
     julianMonth++; 
    } 
    else { 
     julianYear--; 
     julianMonth += 13; 
    } 

    double julian = (java.lang.Math.floor(365.25 * julianYear) 
     + java.lang.Math.floor(30.6001*julianMonth) + day + 1720995.0); 
    if (day + 31 * (month + 12 * year) >= jgreg) { 
     // change over to Gregorian calendar 
     int ja = (int)(0.01 * julianYear); 
     julian += 2 - ja + (0.25 * ja); 
    } 

    return java.lang.Math.floor(julian); 
} 
+1

作为一个侧面说明,您可以将泛型类型添加到一个比较 –

+7

你比较似乎罚款。无论比较器做什么,调用'Collections.sort'都不能“从ArrayList'中删除所有内容。错误可能是其他地方。 – dasblinkenlight

+0

你可以请你发布toJulian方法吗? – Andy

回答

0

尝试这个

public static Hashtable<String, String> sortValue(Hashtable<String, String> t) 
      { 
       //Transfer as List and sort it 
       ArrayList<Map.Entry<String, String>> l = new ArrayList<Entry<String, String>>(t.entrySet()); 
        Hashtable<String,String> f = new Hashtable<String,String>(); 
        Collections.sort(l, new Comparator<Map.Entry<String, String>>(){ 
        public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) { 
        return o1.getValue().compareTo(o2.getValue()); 
      }});} 
相关问题