通过作为参数传递的ID列表来查询查询结果

时间:2011-04-05 11:07:26

标签: java android sqlite

我有一个函数返回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(之后是否订购结果)的解决方案的任何建议?

2 个答案:

答案 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();
}
}