Получение java коллекции объектов в алфавитном порядке - PullRequest
4 голосов
/ 13 мая 2010

У меня есть вопрос, который я действительно не знаю, с чего начать. Поэтому я решил спросить это здесь.

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

Заполнение выпадающего списка происходит следующим образом:

Я запрашиваю базу данных и извлекаю Id и Name, создаю объект с именем «UserList» и устанавливаю переменные name и id с тем, что получаю. Затем я добавляю этот объект в ArrayList. Я делаю это снова и снова.

Затем я преобразовываю эту коллекцию в массив и передаю ее на свою страницу JSP с помощью

session.setAttribute("userList", UserList);

Затем я заполняю раскрывающийся список, как показано ниже.

<c:forEach items="${userList}" var="c" >
`<html-el:option value="${c.id}"><c:out value="${c.name}"/></html-el:option> </c:forEach>

Возможно, есть простой ответ, но как мне отсортировать эти имена?

Ответы [ 7 ]

8 голосов
/ 13 мая 2010

Обычно вы делаете это, вызывая public static Collections.sort(List<T> list) с вашим ArrayList в качестве параметра, но позаботьтесь о реализации интерфейса Comparable, иначе он не будет работать (если они Strings, то он уже реализован):

Collections.sort(yourList);

В противном случае, если у вас есть собственный класс, но вы хотите отсортировать только по некоторому строковому полю внутри, вы можете делегировать метод compareTo:

public class User implements Comparable<User> {
   public int compareTo(User other) {
      return userName.compareTo(other.userName);
   }
}

Наконец, если никто не подходит, просто примените свой собственный метод compareTo, он должен вернуть -1, 0 или 1, если вызывающий объект меньше, равен или больше переданного объекта.

3 голосов
/ 13 мая 2010

Майкл, вы должны использовать соединение и заказ, чтобы получать эти данные из базы данных, а не извлекать и сортировать в Java:

 select person.id, person.name from person inner join person_company using(personid)
 order by person.name;

И не пытаться сортировать и делать это в Java (приведенный выше синтаксис может быть не идеальным, мой MySQL немного ржавый).

1 голос
/ 13 мая 2010

Я бы изменил запрос к базе данных, чтобы он возвращал строки в нужном вам порядке.

Если вы используете SQL, запрос может выглядеть следующим образом.

SELECT Id, Name FROM Person ORDER BY Name;

Это имеет некоторые преимущества перед выполнением в коде.

  • Это быстрее.
  • Вам не нужно менять код.
  • Это меньше работы.
1 голос
/ 13 мая 2010

Я думаю, что наиболее идеальным решением этой проблемы является сортировка их на уровне запросов к базе данных. Если таблица хорошо проиндексирована, это будет самая быстрая и спорная «лучшая» практика.

При этом, если вы просто хотите отсортировать этот список и не начинать работать на стороне базы данных, используйте Collections.sort, и ваш UserList реализует Comparable<UserList>

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

0 голосов
/ 13 мая 2010

Вы можете сортировать в базе данных, вместо того, чтобы запускать много запросов с

select Id, Name from Person where id = '+variable+';

Вы можете перебирать переменные и создавать список через запятую, таким образом вы запускаете только один запрос

int[] variableList = wherever_you_get_it_from;
StringBuffer csv = new StringBuffer();
for (int i = 0; i < variableList.length; i++) {
   csv.append(variableList[i]);
   if (i < variableList.length - 1)
      csv.append(",");
}

тогда дайте

select Id, Name from Person where id in ( +csv.toString()+) order by Name;

Поскольку вы получаете идентификаторы пользователей из таблицы компании, вы можете присоединиться и получить

select u.usrid, u.name from company c left join user u on c.usrid = u.usrid
   where c.companyid in (comapnyid1, companyid2, companyid3) order by u.name;
0 голосов
/ 13 мая 2010

Вы должны использовать Collections.sort и любой из

  1. Заставьте ваш пользовательский класс реализовать Comparable интерфейс
  2. Создание UserListComparator реализации Comparator<UserList> интерфейса

Подробнее см. Документацию по интерфейсу Comparable.

0 голосов
/ 13 мая 2010

Вы можете попробовать переопределить метод compareTo для UserList, чтобы он сравнивал элементы в алфавитном порядке в соответствии с некоторым строковым значением. Затем вызовите метод сортировки списка массивов, и он должен отсортировать их, используя CompareTo Overdord.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...