Сортируемый табличный Java-класс - PullRequest
2 голосов
/ 19 февраля 2009

Кто-нибудь знает класс в Java, у которого есть список элементов, чтобы элементы могли сортироваться любым из элементов-элементов? Идея заключается в том, чтобы иметь некоторую реализацию, похожую на таблицу базы данных, где вы можете просто добавить поля для сортировки. Для иллюстрации:

SomeTable table = new SomeTable();
table.addField("name", String);
table.addField("age", int);
table.addField("hair color", String);
table.add(new Object[]{"Thomas", 32, "brown"});
table.add(new Object[]{"Jack", 34, "black"});

table.sort("age") отсортирует таблицу так, чтобы Томас был первым элементом, а table.sort("name") отсортировал бы таблицу так, чтобы Джек был первым элементом.

Я могу сам написать что-то подобное (на самом деле я делал это один раз), но мне просто интересно посмотреть, есть ли готовая библиотека для таких вещей (без базы данных).

PS: я знаю, что int - это не класс, но здесь дело не в этом. Этот пример кода приведен здесь, чтобы показать ожидаемую функциональность.


Ответы [ 7 ]

4 голосов
/ 19 февраля 2009

Вы должны рассмотреть функцию Collection.sort() с интерфейсом Comparator. Вот очень хороший пример здесь

3 голосов
/ 19 февраля 2009

Публичные списки Publicobject имеют в точности то, что вам нужно. Я использовал его для требований к генерации отчетов. По сути, это механизм для предоставления вам представления в списке в памяти. Ваши представления могут быть отсортированы, отфильтрованы и, как правило, преобразованы различными способами. Он также имеет простой механизм обновления, поэтому вы можете вставлять новые элементы в свой основной список, и все отфильтрованные / отсортированные представления будут видеть событие обновления.

Традиционно он был очень популярен в качестве вспомогательной модели для гридов Swing / JTables, но он никоим образом не связан с API Swing и может использоваться везде, где вы кэшируете список.

Когда я использовал его, у нас было только несколько тысяч объектов в памяти, и производительность была превосходной. Не уверен, как это масштабируется до огромных чисел.

3 голосов
/ 19 февраля 2009

Самым близким, что я могу себе представить, является API Apache Commons BeanUtils . Например, для таблицы «студент».

  DynaProperty[] props = new DynaProperty[]{
        new DynaProperty("firstName", String.class),
        new DynaProperty("lastName",  String.class),
        new DynaProperty("address", java.util.Map.class)

      };
    BasicDynaClass dynaClass = new BasicDynaClass("student", null, props);

Дано собрание таблицы этих студенческих предметов. Мы определяем BeanComparator

 BeanComparator surnameComparator
        = new BeanComparator("lastname");
Collections.sort(table, surnameComparator);

Не уверен, что это то, что вы ищете, но это кажется довольно близко.

1 голос
/ 19 февраля 2009

Существует хотя бы одна реализация javax.sql.rowset, которая поддерживает сортировку.

Многие расширения Swing TableModel позволяют сортировать (я думаю, что это учебный пример). Не бойтесь бит Swing, даже если вы не занимаетесь GUI. Большинство моделей Swing вообще не ссылаются на «настоящие» компоненты Swing, поэтому их можно считать совершенно отдельными (кроме как для неправильного именования).

1 голос
/ 19 февраля 2009

Библиотека коллекций Google имеет аналогичную вещь, называемую Multimap . Согласно документации API:

"Коллекция, похожая на карту, но которая может связывать несколько значений с одним ключом. Если дважды вызвать put (K, V), с одним и тем же ключом, но разными значениями, мультикарта содержит отображения из ключ к обоим значениям. "

Таким образом, вы можете иметь имя в качестве ключа и позвонить put("Thomas", 32); затем put("Thomas", "brown"); и т. Д.

Если вы используете реализацию этого интерфейса TreeMultimap , вы можете передать Comparator для сортировки / упорядочения.

1 голос
/ 19 февраля 2009
0 голосов
/ 19 февраля 2009
  • Создать класс с полями с именами «имя», «возраст», «цвет волос»
  • Поместите экземпляры этого класса в ArrayList
  • Используйте Collections.sort () с пользовательским компаратором, который сравнивает определенное поле
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...