我有一个List>,它是数据库表的直接表示。我正在尝试将数据加载到HashMaps列表中后进行排序并应用一些魔术。就我而言,这是唯一的快捷方法,因为我有一个规则引擎,该引擎实际上是在几次计算后更新HashMap中的值的。
这是HashMap的示例数据表示形式(HashMap的列表)-
{fromDate=Wed Mar 17 10:54:12 EDT 2010, eventId=21, toDate=Tue Mar 23 10:54:12 EDT 2010, actionId=1234}
{fromDate=Wed Mar 17 10:54:12 EDT 2010, eventId=11, toDate=Wed Mar 17 10:54:12 EDT 2010, actionId=456}
{fromDate=Sat Mar 20 10:54:12 EDT 2010, eventId=20, toDate=Thu Apr 01 10:54:12 EDT 2010, actionId=1234}
{fromDate=Wed Mar 24 10:54:12 EDT 2010, eventId=22, toDate=Sat Mar 27 10:54:12 EDT 2010, actionId=1234}
{fromDate=Wed Mar 17 10:54:12 EDT 2010, eventId=11, toDate=Fri Mar 26 10:54:12 EDT 2010, actionId=1234}
{fromDate=Sat Mar 20 10:54:12 EDT 2010, eventId=11, toDate=Wed Mar 31 10:54:12 EDT 2010, actionId=1234}
{fromDate=Mon Mar 15 10:54:12 EDT 2010, eventId=12, toDate=Wed Mar 17 10:54:12 EDT 2010, actionId=567}
我正在努力实现几件事-
1)按actionId和eventId对列表进行排序,之后数据看起来像-
{fromDate=Wed Mar 17 10:54:12 EDT 2010, eventId=11, toDate=Wed Mar 17 10:54:12 EDT 2010, actionId=456}
{fromDate=Mon Mar 15 10:54:12 EDT 2010, eventId=12, toDate=Wed Mar 17 10:54:12 EDT 2010, actionId=567}
{fromDate=Wed Mar 24 10:54:12 EDT 2010, eventId=22, toDate=Sat Mar 27 10:54:12 EDT 2010, actionId=1234}
{fromDate=Wed Mar 17 10:54:12 EDT 2010, eventId=21, toDate=Tue Mar 23 10:54:12 EDT 2010, actionId=1234}
{fromDate=Sat Mar 20 10:54:12 EDT 2010, eventId=20, toDate=Thu Apr 01 10:54:12 EDT 2010, actionId=1234}
{fromDate=Wed Mar 17 10:54:12 EDT 2010, eventId=11, toDate=Fri Mar 26 10:54:12 EDT 2010, actionId=1234}
{fromDate=Sat Mar 20 10:54:12 EDT 2010, eventId=11, toDate=Wed Mar 31 10:54:12 EDT 2010, actionId=1234}
2)如果将以上列表按actionId分组,则将它们分为3组-actionId = 1234,actionId = 567和actionId = 456。现在这是我的问题-
对于每个具有相同eventId的组,我需要更新记录,以使它们的fromDate到toDate的范围更广。
意思是,如果您考虑最后两行,则它们具有相同的actionId = 1234和相同的eventId = 11。 31 10:54:12并将这两个记录的fromDate和toDate分别更新到3月17日星期三10:54:12和3月31日星期三10:54:12。
有任何想法吗?
PS:我已经有一些伪代码开始了。
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import org.apache.commons.lang.builder.CompareToBuilder;
public class Tester {
boolean ascending = true ;
boolean sortInstrumentIdAsc = true ;
boolean sortEventTypeIdAsc = true ;
public static void main(String args[]) {
Tester tester = new Tester() ;
tester.printValues() ;
}
public void printValues ()
{
List<HashMap<String,Object>> list = new ArrayList<HashMap<String,Object>>() ;
HashMap<String,Object> map = new HashMap<String,Object>();
map.put("actionId", new Integer(1234)) ;
map.put("eventId", new Integer(21)) ;
map.put("fromDate", getDate(1) ) ;
map.put("toDate", getDate(7) ) ;
list.add(map);
map = new HashMap<String,Object>();
map.put("actionId", new Integer(456)) ;
map.put("eventId", new Integer(11)) ;
map.put("fromDate", getDate(1)) ;
map.put("toDate", getDate(1) ) ;
list.add(map);
map = new HashMap<String,Object>();
map.put("actionId", new Integer(1234)) ;
map.put("eventId", new Integer(20)) ;
map.put("fromDate", getDate(4) ) ;
map.put("toDate", getDate(16) ) ;
list.add(map);
map = new HashMap<String,Object>();
map.put("actionId", new Integer(1234)) ;
map.put("eventId", new Integer(22)) ;
map.put("fromDate",getDate(8) ) ;
map.put("toDate", getDate(11)) ;
list.add(map);
map = new HashMap<String,Object>();
map.put("actionId", new Integer(1234)) ;
map.put("eventId", new Integer(11)) ;
map.put("fromDate",getDate(1) ) ;
map.put("toDate", getDate(10) ) ;
list.add(map);
map = new HashMap<String,Object>();
map.put("actionId", new Integer(1234)) ;
map.put("eventId", new Integer(11)) ;
map.put("fromDate",getDate(4) ) ;
map.put("toDate", getDate(15) ) ;
list.add(map);
map = new HashMap<String,Object>();
map.put("actionId", new Integer(567)) ;
map.put("eventId", new Integer(12)) ;
map.put("fromDate", getDate(-1) ) ;
map.put("toDate",getDate(1)) ;
list.add(map);
System.out.println("\n Before Sorting \n ");
for(int j = 0 ; j < list.size() ; j ++ )
System.out.println(list.get(j));
Collections.sort ( list , new HashMapComparator2 () ) ;
System.out.println("\n After Sorting \n ");
for(int j = 0 ; j < list.size() ; j ++ )
System.out.println(list.get(j));
}
public static Date getDate(int days) {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.DATE, days);
return cal.getTime() ;
}
public class HashMapComparator2 implements Comparator
{
public int compare ( Object object1 , Object object2 )
{
if ( ascending == true )
{
return new CompareToBuilder()
.append(( ( HashMap ) object1 ).get ( "actionId" ), ( ( HashMap ) object2 ).get ( "actionId" ))
.append(( ( HashMap ) object2 ).get ( "eventId" ), ( ( HashMap ) object1 ).get ( "eventId" ))
.toComparison();
}
else
{
return new CompareToBuilder()
.append(( ( HashMap ) object2 ).get ( "actionId" ), ( ( HashMap ) object1 ).get ( "actionId" ))
.append(( ( HashMap ) object2 ).get ( "eventId" ), ( ( HashMap ) object1 ).get ( "eventId" ))
.toComparison();
}
}
}
}
最佳答案
据我了解,从您的描述中,所有数据都是从数据库检索的。为什么不通过SQL进行排序和分组呢?
UPD(评论后):那么我绝对喜欢以下解决方案
TreeMap<Integer, List<DbRecord>>
其中actionIds是此TreeMap的键,列表的每个项目都是DbRecord对象。
在这种情况下,排序和分组问题将被隐式解决,而您仅需遍历地图即可更新日期值。
更好的方法是使用Google收藏夹中的TreeMultimap。