按业务逻辑ID排序列表

时间:2014-09-16 07:17:23

标签: java sorting

我很惊讶我之前在java中没遇到这个问题。我知道我可以使用装饰器对象解决这个问题,但我想知道是否有人能想到更简洁的方法。

我有一个方法可以获取ID列表。在方法内部我做了一些操作,从db等检索对象等。在方法结束时,不保证结果列表的顺序。我想通过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可以按顺序包含1,2,3。或者4,7,3,1,7这是我希望将VO返回的顺序传递ID的顺序。

我可以装饰VO并添加另一个参数以允许一些自然顺序,但这似乎很多代码非常简单。就像我在开始时所说的那样,在这些年之后,我已经感到惊讶,并不是已经相遇了。

对于这样做有一个很好的简洁模式的想法吗?

由于

3 个答案:

答案 0 :(得分:1)

如何实现一个Comparator,它根据你获得的列表比较两个MyObjects,然后使用这个比较器对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()));
}

}

我还没有测试过这段代码,也不确定这是否是有效的方式。

答案 1 :(得分:0)

我会通过对每个ID执行查询来解决它。 如果使用迭代器迭代列表,并为每个ID执行数据库查询并将其添加到结果列表中,在我看来,返回的列表包含与参数列表中的ID顺序相同的对象。

也许您只想编写一个查询,然后我会考虑修改您的SQL查询......

答案 2 :(得分:0)

排序结果示例:

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;
}