2015-08-17 4 views
1

С помощью hibernate я приведу список результатов из таблицы образцов ANIMALS. Метод спящего режима выглядит следующим образом:Разбиение списка по нескольким условиям

... 
List<Animals> animalList= null; 
     try { 
      Query query = session.createQuery("SELECT * FROM animals ORDER BY COLOR , HEIGHT , AGRESSIVE; "); 
      animalList= query.list(); 
     } 
... 

Пример набора результатов будет следующим:

NAME COLOR HEIGHT AGRESSIVE 
--------------------------------- 
JIMMY BLACK SHORT NO 
RIPPER BLACK SHORT YES 
GOOFY BLACK TALL NO 
MURPHY BLACK TALL YES 
PAUL WHITE SHORT NO 
ROB  WHITE SHORT YES 
BOBBY WHITE TALL NO 
JACK WHITE TALL YES 

Мой фактический список результатов имеет минимум 100000 записей так разборе список и исполняющих list.add(..) для каждый не очень мудр; Что бы я хотел сделать, это разбить набор результатов на 8 небольших списков, содержащих каждую комбинацию COLOR, HEIGHT и AGGRESSIVE. После этого списки будут переданы в качестве параметра методу для выполнения ряда операций.

Я могу использовать только Java 1.6 или ниже. Моя главная цель уйти от IndexOutOfBounds мер я взял и сумасшедшей суммой в IF's, как следующее:

for (int i = 0; i < animalList.size(); i++) { 
previousAnimal = animals.get(i-1); 
currentAnimal = animals.get(i); 
nextAnimal = animals.get(i+1); 
    ...//extra code 
    IF (previousAnimal.getColor() != currentAnimal.getColor() || previousAnimal.getHeight() != currentAnimal.getColor() || previousAnimal.getAgressive() != currentAnimal.getAgressive()) 
    ...//extra code 
    IF (currentAnimal.getColor() != nextAnimal.getColor() || currentAnimal.getHeight() != nextAnimal.getColor() || currentAnimal.getAgressive() != nextAnimal.getAgressive()) 
    ...//extra code 
+1

Если вы используете Java 8, вы можете сделать это с помощью Stream API. Если вы используете Java 7 или ранее, используйте библиотеку типа quaere или аналогичную. –

+0

Отфильтруйте запрос, вы можете использовать Критерии критериев API – santiago92

+1

Или поместить все в «MultiMap» и использовать ключ, который является кортежем ваших свойств с последовательным методом 'hascode()'. – dotvav

ответ

0

Может быть, вы можете использовать DENSE_RANK аналитическую функцию, чтобы идентифицировать животных с аналогичными характеристиками:

... 
List<Animals> animalList= null; 
     try { 
      Query query = session.createQuery("SELECT a.*, DENSE_RANK() OVER (ORDER BY COLOR, HEIGHT, AGRESSIVE) GRP FROM animals a ORDER BY COLOR, HEIGHT, AGRESSIVE; "); 
      animalList= query.list(); 
     } 
... 

пример набора результатов будет следующим:

NAME COLOR HEIGHT AGRESSIVE GRP 
------------------------------------- 
JIMMY BLACK SHORT NO   1 
RIPPER BLACK SHORT YES   2 
GOOFY BLACK TALL NO   3 
MURPHY BLACK TALL YES   4 
PAUL WHITE SHORT NO   5 
ROB  WHITE SHORT YES   6 
BOBBY WHITE TALL NO   7 
JACK WHITE TALL YES   8 

Wher e каждая отдельная комбинация Color, Height и Aggressive даст отличное значение для столбца GRP. Тогда вы можете упростить свой другой код:

for (int i = 0; i < animalList.size(); i++) { 
previousAnimal = animals.get(i-1); 
currentAnimal = animals.get(i); 
nextAnimal = animals.get(i+1); 
    ...//extra code 
    IF (previousAnimal.getGrp() != currentAnimal.getGrp()) 
    ...//extra code 
    IF (currentAnimal.getGrp() != nextAnimal.getGrp()) 
    ...//extra code 
Смежные вопросы