2014-09-16 2 views
1

Я удивлен, что я не смог пройти мимо этого раньше в java. Я знаю, что могу решить это, используя объекты декоратора, но мне было интересно, может ли кто-нибудь подумать о более сжатом способе этого.Сортировка списка по бизнес-логике ids

У меня есть метод, который принимает список идентификаторов. Внутри метода я делаю некоторые манипуляции, извлекаю объекты из db и т. Д. В конце метода порядок результирующего списка не гарантируется. Я хочу заказать его по идентификатору в идентификаторах, которые передаются в метод. Эти идентификаторы не могут быть численно упорядочены.

Фро Пример

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 
} 

идентификаторы могут содержать 1,2,3 в указанном порядке. Или 4,7,3,1,7 Это порядок, в котором идентификаторы были переданы в том порядке, в котором я хочу вернуть ВО.

Я мог бы украсить VO и добавить еще один параметр, чтобы некоторые естественный порядок, но это, кажется, много кода для чего-то довольно простого. Как я уже сказал в начале, я удивляюсь, что все эти годы не пришло к этому уже.

Любые идеи для красивого лаконичного шаблона для этого?

Благодаря

+0

Поскольку вы получаете данные из БД, почему вы не сортируете его, когда вы извлекаете его из базы данных? –

+0

хороший момент, я забыл, что могу сортировать с помощью пользовательского поля ids в поиске db. Будет ли проверять JPA здесь из интереса. Однако я все еще думаю, что могут возникнуть проблемы, когда я манипулирую VO. В идеале я бы хотел сделать это в конце манипуляции – RNJ

+0

, если вы используете список. вы можете переопределить метод equals и hashcode, а затем list.sort. –

ответ

1

Как о реализации компаратора, который сравнивает два 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())); 
} 

}

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

+0

безупречное спасибо. Хорошее элегантное решение, которым я был после :) – RNJ

0

Я бы решить путем выполнения запроса для каждого отдельного ID. Если вы перебираете список с помощью итератора, и для каждого идентификатора вы делаете запрос БД и добавляете его в список результатов, на мой взгляд, возвращенный список содержит объекты в том же порядке, что и идентификаторы в списке аргументов.

Может быть, вы хотите, чтобы написать только один запрос, а затем я хотел бы посмотреть на изменения вашего запроса ...

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; 
} 
Смежные вопросы