我有一个函数返回ID在给定数组中的对象列表:
public static List<T> findByIds(int[] ids) {
final String where = "_ID IN (" + StringUtils.implode(ids, ",") + ")";
final Cursor c = db.query(TABLE, ALL_COLUMNS, where, null, null, null, null);
final List<T> result = new ArrayList<T>(c.getCount());
while (c.moveToNext()) {
final T t = createFromCursor(c);
result.add(t);
}
c.close();
return result;
}
我需要结果与ids
函数参数的顺序相同。最多ids
函数参数将包含200到300个元素。
我看了Ordering query result by list of values这似乎解决了同样的问题,但答案中有很多SQLServer特定的东西。
基于SQL(获取结果排序)或Java(之后是否订购结果)的解决方案的任何建议?
答案 0 :(得分:2)
使用
java.util.Collections.sort(List<T> list, Comparator<? super T> c)
将你的id传递给比较器并使用它的位置进行排序。
答案 1 :(得分:0)
如果列表足够短,您可以自己手动对结果进行排序:根据排序顺序构建地图作为键,然后根据排序顺序构建新列表。我会说,这不是高效,但效率并不比运行代码重要。这是一个例子:
package sorting;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SortResult {
public static void main(String[] args) {
int[] sortOrder = { 5, 2, 8, 4, 14, 1, 6, 9, 3, 7 };
List<Thing> things = new ArrayList<Thing>();
for (int i = 1; i < 10; i++) {
Thing thing = new Thing();
thing.setId(i);
things.add(thing);
}
Map<Integer, Thing> thingMap = new HashMap<Integer, Thing>();
for (Thing thing : things) {
thingMap.put(thing.getId(), thing);
}
List<Thing> sortedThings = new ArrayList<Thing>();
for (int id : sortOrder) {
if (thingMap.get(id) != null) {
sortedThings.add(thingMap.get(id));
}
}
System.out.println("expected order: "+Arrays.toString(sortOrder)
+"\nActual order: ");
for(Thing thing:sortedThings) {
System.out.println(thing);
}
}
}
class Thing {
int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Thing [id=").append(id).append("]");
return builder.toString();
}
}