Сравнение бобов с несколькими свойствами, в зависимости от двух бобов каждый - PullRequest
1 голос
/ 11 декабря 2011

У меня проблема. Сначала позвольте мне показать вам структуру бобов, которую я хочу сравнить:

ItemDTO содержит:

  • имя
  • Itemid
  • Тип
  • подтип
  • * 1016 часть тела *
  • цена

ItemOnCharacterDTO содержит:

  • OwnerId
  • Itemid
  • Количество
  • место

ItemDTO статически считывается из файлов XML. Их тысячи, и они не меняются (по крайней мере, мне все равно, если они меняются в данный момент). ItemOnCharacterDTOs создаются путем запроса к базе данных. OwnerID, itemID, количество и местоположение варьируются в зависимости от символа и, следовательно, сохраняются в базе данных. ItemID здесь соответствует действительному ItemDTO.

У меня есть массив (или ArrayList) ItemOnCharacterDTO-объектов, которые я хочу отсортировать по нескольким критериям, например, by "itemOnCharacterDTO.ownerID", "itemDTO.name", "itemDTO.type".

Если бы я объединил ItemDTO и ItemOnCharacterDTO в один класс (например, ItemAllDTO), я мог бы легко использовать apache BeanComparator . Однако, я не. Причина в том, что у пользователя может быть несколько элементов на разных персонажах. Базовые данные элемента (ItemDTO-данные) одинаковы, в то время как пользовательские данные (ItemOnCharacterDTO-данные) изменяются. Поэтому я загружаю первый только один раз, загружая пользовательские данные каждый раз, когда сталкиваюсь с другим ItemOnCharacterDTO.

Поскольку я пишу все это в GWT, я решил отсортировать на сервере, потому что именно там находится вся информация (в отличие от внешнего интерфейса, где информация, относящаяся к элементам, загружается с нумерацией страниц). Я использую Java на стороне сервера. Я написал картограф для правильного извлечения статических XML-данных из XML-файлов, связанных с предметами. Но информация, связанная с символами, хранится в базе данных mysql .

Я хочу иметь возможность сортировать массив или ArrayList ItemOnCharacterDTOs по атрибутам, присутствующим в ItemOnCharacterDTO- или ItemDTO-объекте (У меня есть способ определить, к какому DTO принадлежит данный атрибут - значение: Я знаю, что если пользователь сортирует по «количеству», мне нужно проверить ItemOnCharacterDTO-объект для этого атрибута, а не ItemDTO-объект).

У каждого пользователя может быть несколько тысяч объектов. Каждый ItemOnCharacterDTO имеет около 5 атрибутов, но каждый ItemDTO имеет около 25 или около того. Поэтому объединение их в один объект - даже просто для сравнения - на самом деле не вариант, так как это будет очень медленно и занимать память.

У кого-то есть лучший подход? Я рад за любую помощь - даже если вы просто даете сырую идею. Я разберусь с этим.

Большое спасибо заранее! Ваша помощь очень ценится!

Игорь.

P.s .: Если у вас есть дополнительные вопросы, пожалуйста, не стесняйтесь спрашивать - я отвечу как можно скорее! P.s.2: есть ли что-то вроде "LINQ" для Java? Может быть, это поможет мне решить мою проблему?

Ответы [ 4 ]

0 голосов
/ 19 ноября 2017

В то время ( до Java 8 ) я в конечном итоге использовал JoSQL , потому что я в конечном итоге хотел динамические запросы так, чтобы большинство (включая меня) могли легко понять. Это позволило мне выбирать, сравнивать, упорядочивать и ограничивать набор результатов различными способами - именно то, что я хотел сделать тогда.

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

Редактировать: Я никоим образом не связан с JoSQL, я просто использовал его для решения своей проблемы.

0 голосов
/ 11 декабря 2011

Вы можете реализовать свой собственный компаратор, который учитывает данные обоих классов.В качестве вспомогательной структуры вы можете хранить 2 карты, где ключом является идентификатор DTO для обоих DTO.Таким образом, вы можете найти второй DTO по ID для сравнения.

0 голосов
/ 11 декабря 2011

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

0 голосов
/ 11 декабря 2011

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

Вы также можете переопределить метод equals и hashcode в обоих объектах.

Вы также можете обернуть оба объекта в один и использовать их для сортировки.

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