Java 按业务逻辑ID对列表进行排序

Java 按业务逻辑ID对列表进行排序,java,sorting,Java,Sorting,我很惊讶我以前在爪哇没有遇到过这个问题。我知道我可以用decorator对象解决这个问题,但我想知道是否有人能想出一种更简洁的方法来解决这个问题 我有一个获取ID列表的方法。在这个方法中,我做了一些操作,从数据库中检索对象等等。在这个方法的末尾,结果列表的顺序并没有得到保证。我想在传递给方法的ID上按ID排序。这些ID不能按数字顺序排列 以身作则 List<MyObject> get (List<Integer> ids) { //get from db etc a

我很惊讶我以前在爪哇没有遇到过这个问题。我知道我可以用decorator对象解决这个问题,但我想知道是否有人能想出一种更简洁的方法来解决这个问题

我有一个获取ID列表的方法。在这个方法中,我做了一些操作,从数据库中检索对象等等。在这个方法的末尾,结果列表的顺序并没有得到保证。我想在传递给方法的ID上按ID排序。这些ID不能按数字顺序排列

以身作则

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谢谢。一个很好的优雅解决方案,这正是我所追求的:)