Java 按业务逻辑ID对列表进行排序
我很惊讶我以前在爪哇没有遇到过这个问题。我知道我可以用decorator对象解决这个问题,但我想知道是否有人能想出一种更简洁的方法来解决这个问题 我有一个获取ID列表的方法。在这个方法中,我做了一些操作,从数据库中检索对象等等。在这个方法的末尾,结果列表的顺序并没有得到保证。我想在传递给方法的ID上按ID排序。这些ID不能按数字顺序排列 以身作则Java 按业务逻辑ID对列表进行排序,java,sorting,Java,Sorting,我很惊讶我以前在爪哇没有遇到过这个问题。我知道我可以用decorator对象解决这个问题,但我想知道是否有人能想出一种更简洁的方法来解决这个问题 我有一个获取ID列表的方法。在这个方法中,我做了一些操作,从数据库中检索对象等等。在这个方法的末尾,结果列表的顺序并没有得到保证。我想在传递给方法的ID上按ID排序。这些ID不能按数字顺序排列 以身作则 List<MyObject> get (List<Integer> ids) { //get from db etc a
List<MyObject> get (List<Integer> ids) {
//get from db etc and do manipluation
//MyObject contains an id which corresponds to one of the ids passed in
//order the list according to the order of the ids parameter
}
列表获取(列表ID){
//从db等处获取并进行管理
//MyObject包含一个id,该id对应于传入的一个id
//根据ids参数的顺序排列列表
}
ID可以按该顺序包含1,2,3。或者4,7,3,1,7这是ID被传递的顺序,我希望返回VO的顺序
我可以装饰VOs并添加另一个参数,以允许一些自然排序,但这似乎是一个非常简单的代码很多。就像我一开始说的,我很惊讶这么多年过去了,竟然还没有发生这样的事情
有没有一个好的简洁模式的想法
谢谢我会通过对每个ID执行查询来解决这个问题。 如果使用迭代器迭代列表,并对每个ID执行DB查询并将其添加到结果列表中,我认为返回的列表包含的对象的顺序与参数列表中的ID相同
也许您只想编写一个查询,然后我会考虑修改您的sql查询…排序结果示例:
private List<MyObject> get(List<Integer> ids)
{
HashMap<Integer, MyObject> calculated;
for (Integer id : ids)
{
// do fetch work here
MyObject object = doWork(id);
calculated.put(id, object);
}
// sorted result
LinkedList<Integer> sortedIds = new LinkedList<Integer>();
sortedIds.addAll(ids);
Collections.sort(sortedIds);
LinkedList<MyObject> sortedResult = new LinkedList<MyObject>();
for (Integer id : ids)
{
sortedResult.add(calculated.get(id));
}
return sortedResult;
}
私有列表获取(列表ID)
{
计算HashMap;
用于(整数id:ids)
{
//你一定要在这里找工作
MyObject对象=doWork(id);
计算。放置(id,对象);
}
//排序结果
LinkedList sortedIds=新建LinkedList();
SORTERDIDS.addAll(ID);
收集.分类(SORTERDIDS);
LinkedList sortedResult=新建LinkedList();
用于(整数id:ids)
{
sortedResult.add(calculated.get(id));
}
返回分类结果;
}
如何实现一个比较器,根据作为输入的列表比较两个MyObject,然后使用该比较器对MyObject对象进行排序
public class MyObjectComparator implements Comparator<MyObject> {
List<Integer> list;
MyObjectComparator(List<Integer> list)
{
this.list = list;
}
@Override
public int compare(MyObject o1, MyObject o2) {
return Integer.compare(list.indexOf(o1.getId()), list.indexOf(o2.getId()));
}
公共类MyObjectComparator实现Comparator{
名单;
MyObjectComparator(列表)
{
this.list=列表;
}
@凌驾
公共整数比较(MyObject o1,MyObject o2){
返回Integer.compare(list.indexOf(o1.getId()),list.indexOf(o2.getId());
}
}
我还没有测试过这段代码,也不确定这是否是一种有效的方法。既然您是从数据库获取数据,为什么不在从数据库检索数据时对其进行排序?很好,我忘了我可以使用数据库检索中的自定义ID字段进行排序。出于兴趣,我想在这里查一下JPA。然而,我仍然认为当我操纵VOs时可能会出现问题。理想情况下,如果您使用的是列表,我希望在操作结束时执行此操作。您可以重写equals和hashcode方法,然后list.sort.perfect谢谢。一个很好的优雅解决方案,这正是我所追求的:)