Java 按多个条件拆分列表

Java 按多个条件拆分列表,java,sql,oracle,hibernate,Java,Sql,Oracle,Hibernate,使用hibernate,我从一个示例表ANIMALS中获得了一个结果列表。hibernate方法如下所示: ... List<Animals> animalList= null; try { Query query = session.createQuery("SELECT * FROM animals ORDER BY COLOR , HEIGHT , AGRESSIVE; "); animalList= query.

使用hibernate,我从一个示例表
ANIMALS
中获得了一个结果列表。hibernate方法如下所示:

...
List<Animals> animalList= null;
        try {
            Query query = session.createQuery("SELECT * FROM animals ORDER BY COLOR , HEIGHT , AGRESSIVE; ");
            animalList= query.list();
        }
...
我的实际结果列表至少有100000条记录,因此解析列表并执行
list.add(..)
不是很明智; 我想做的是将结果集拆分为8个较小的列表,其中包含
颜色
高度
攻击性
的每个组合。 之后,列表将作为参数提供给方法,以便执行一系列操作

我只能使用Java1.6或更低版本。 我的主要目标是摆脱我采取的
IndexOutOfBounds
措施和
IF的疯狂行为,如以下所示:

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
    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
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
for(int i=0;i
也许您可以使用
稠密等级
分析功能来识别具有相似特征的动物:

...
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();
        }
...
其中,
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
for(int i=0;i
也许您可以使用
稠密等级
分析功能来识别具有相似特征的动物:

...
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();
        }
...
其中,
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
for(int i=0;i
如果您使用的是Java 8,则可以使用流API。如果您使用的是Java 7或更早版本,则可以使用quaere或Similar之类的库筛选查询,您可以使用Criteria API的条件,或将所有内容放入
多映射中,并使用一个键,该键是具有一致
hascode()的属性元组
method。您是否对整个集合感兴趣,并希望将其过滤到不同的数据结构中在SQL查询之后,还是您希望从基于某些条件获得的1000000条记录中获得一个小集合?@uıɥɔɐɯ无论结果是用SQL还是用JAVA拆分都没有关系。我只对最快的解决方案感兴趣。我无法在查询中对某个属性进行过滤,因为随着时间的推移,这些属性可能会变成蓝色和红色如果您使用的是Java 8,那么您可以使用流API,而不是黑白的。如果您使用的是Java 7或更早版本,那么可以使用quaere或Similar之类的库过滤查询,您可以使用Criteria API的条件,或者将所有内容放在
多映射中,并使用一个键,该键是具有一致
属性的元组code()
方法。您是否对整个集合感兴趣,并希望将其筛选到不同的数据结构中在SQL查询之后,还是您希望从基于某些条件获得的1000000条记录中获得一个小集合?@uıɥɔɐɯ无论结果是用SQL还是用JAVA拆分都没有关系。我只对最快的解决方案感兴趣。我无法在查询中对某个属性进行过滤,因为随着时间的推移,这些属性可能会变成蓝色和红色而不是黑白左右。。。