Как хранить, сортировать и группировать элементы (список / набор / карта) в Java? - PullRequest
2 голосов
/ 22 января 2012

Учитывая такие данные

UserID, MovieType , year 
1, 2, 2000
1, 3, 2000 
1, 2, 2006
2, 3, 2010
2, 4, 2011
2, 3, 2002
1, 2, 2010

Как лучше всего хранить его в Java, чтобы я мог отсортировать его по первому столбцу, затем по второму столбцу, а затем по третьему?

UserID, MovieType , year 
1, 2, 2000
1, 2, 2006
1, 2, 2010
1, 3, 2000 
2, 3, 2002
2, 3, 2010
2, 4, 2011

А затем сгруппируйте их по идентификатору пользователя и Movietype

UserID, MovieType , movies seen per year  
1, 2, 3
1, 3, 1 
2, 3, 2
2, 4, 1

Ответы [ 2 ]

2 голосов
/ 22 января 2012

Вы должны создать класс, который содержит три элемента данных.Затем сделайте реализацию Comparator.Например, если в классе, содержащем данные, у вас есть три метода получения, например int getUserId(), int getMovieType() и int getYear().Затем вы можете сохранить объекты данных в List и отсортировать этот список, используя ваш компаратор вместе с Collections.sort(List<T> list, Comparator<T> comparator).

Компаратор должен сделать что-то вроде:

public int compare(DataObject data1, DataObject data2) {
   int comparison = data1.getUserId() - data2.getUserId();
   if (comparison == 0) {
       comparison = data1.getMovieType() - data2.getMovieType();
       if (comparison == 0) {
           comparison = data1.getYear() - data2.getYear();
       }
   }
   return comparison;
}
1 голос
/ 22 января 2012

Для очень конкретного решения у вас может быть Map<Integer, Map<Integer, Integer>>.

. Первая карта хранит идентификаторы пользователя на карте, которая сохраняет MovieTypes в MoviesSeenPerYear.

Если вы используете TreeMap в качестве базовых типов, все будет автоматически численно отсортировано.

Это не будет очень гибким, хотя - например, было бы трудно, если бы вы захотели вместо этого пересортировать по MovieTypeиз UserId.


В ответ на ваш комментарий:

У вас будет 2 основных ограничения:

  1. Все классы коллекций Java основаны на int размеров (аналогично индексатору массива Java), максимальный размер которого чуть меньше 2 ^ 31-1, или 2 147 483 647 - или чуть более 2 миллиардов записей.
  2. Ограничения памятивашей JVM / машины.

Если вы хотите работать с таким большим количеством данных и хотели бы более гибкие требования к сортировке, вам бы посоветовали использовать реальную базу данных - любую изстандартныеили даже встроенный в JVM, такой как H2 или Apache Derby .

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