在Java中对HashTables的ArrayList进行排序

时间:2012-06-20 16:55:24

标签: java date arraylist hashmap comparator

这是我的第一篇文章。我在大二暑假期间做CS专业和实习。我对Java有很多经验,但比较对象总是给我带来麻烦。

现在我正在编辑一个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 个答案:

答案 0 :(得分: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());
             }});}