Упорядочить результат запроса по списку идентификаторов, переданных в качестве аргумента - PullRequest
1 голос
/ 05 апреля 2011

У меня есть функция, возвращающая список объектов, идентификатор которых находится в данном массиве:

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 элементов.

Я посмотрел на Упорядочивание результата запроса по списку значений , которое, похоже, решает тот же вопрос, нов ответах содержится много информации, специфичной для SQLServer.

Любое предложение для решения, основанного либо на SQL (чтобы упорядочить результат), либо на Java (упорядочить результат впоследствии)?

Ответы [ 2 ]

2 голосов
/ 05 апреля 2011

Используйте

java.util.Collections.sort(List<T> list, Comparator<? super T> c)

. Передайте свои идентификаторы в Comparator и используйте позицию it для T, чтобы выполнить упорядочение.

0 голосов
/ 05 апреля 2011

Вы всегда можете вручную отсортировать результаты, если список достаточно короткий: построить карту на основе порядка сортировки в качестве ключа, а затем создать новый список на основе порядка сортировки.Я бы сказал, что это не эффективно , но эффективность менее важна, чем запуск кода.Вот пример:

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();
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...