我很惊讶我之前在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并添加另一个参数以允许一些自然顺序,但这似乎很多代码非常简单。就像我在开始时所说的那样,在这些年之后,我已经感到惊讶,并不是已经相遇了。
对于这样做有一个很好的简洁模式的想法吗?
由于
答案 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;
}