Java @在两个列表中使用不同值排序

Java @在两个列表中使用不同值排序,java,spring,spring-boot,Java,Spring,Spring Boot,下面是我的要求和一个简单的例子: public interface Animal {} @Component @Order(1) public class Hippo implements Animal{} @Component @Order(2) public class Crocodile implements Animal{} 我想将它们以不同的顺序注入到两个列表中。例如,陆地动物应在第一个索引中包含河马,在第二个索引中包含鳄鱼,水生动物应在第一个索引中包含鳄鱼,在第二个索引中包含河

下面是我的要求和一个简单的例子:

public interface Animal {}

@Component
@Order(1)
public class Hippo implements Animal{}

@Component
@Order(2)
public class Crocodile implements Animal{}
我想将它们以不同的顺序注入到两个
列表中。例如,
陆地动物
应在第一个索引中包含河马,在第二个索引中包含鳄鱼,
水生动物
应在第一个索引中包含鳄鱼,在第二个索引中包含河马

@Autowired
private List<Animal> landAnimals; // 0-Hippo & 1-Crocodile (achieved with @Order)

@Autowired
private List<Animal> waterAnimals; // 0-Crocodile & 1-Hippo (not achieved)
@Autowired
私人名单陆生动物;//0-河马和1-鳄鱼(通过@Order实现)
@自动连线
私人名单水生动物;//0-鳄鱼和1-河马(未实现)

@订单,我们可以动态更改吗?

您无法使用
@Order
动态更改订单

注意:我认为您不需要创建两个不同的列表。注入单个列表,并在需要时相应地反转

您可以调用
Collections.reverse()
,以根据您的需求反转列表

例如:

@Autowired
private List<Animal> landAnimals;

public void showOrderList() {
   Collections.reverse(animals);
   for (Animal animal : animals) {
      // do some operation..
   }
}
@Autowired
私人名单陆生动物;
public void showOrderList(){
收藏。反面(动物);
用于(动物:动物){
//做些手术。。
}
}

简单的方法是使用
后构造
,您可以在其中更改顺序,如下所示

@PostConstruct
public void init() {
    waterAnimals.sort(AnnotationAwareOrderComparator.INSTANCE.reversed());
}

将订单放入界面:

public interface Animal {
   int getLandOrder();
   int getWaterOrder();
}
创建一个提供不同排序列表的服务bean

@Service
public class AnimalService {

    private final List<Animals> landAnimals;
    private final List<Animals> waterAnimals;

    // BTW, don't use field injection 
    public AnimalService(List<Animal> animals) {
       // Create copies of the list, because they are sorted in place
       landAnimals = new ArrayList<>(animals);
       landAnimals.sort(Comparator.comparing(Animal::getLandOrder));

       waterAnimals = new ArrayList<>(animals);
       waterAnimals.sort(Comparator.comparing(Animal::getWaterOrder));
    }
    
    public List<Animal> getLandAnimals() {
      return landAnimals;
    }

    public List<Animal> getWaterAnimals() {
      return waterAnimals;
    }
}
@服务
公共级动物服务{
私人土地动物最终名单;
私人最终水生动物名单;
//顺便说一句,不要使用现场注入
公共动物服务(列出动物){
//创建列表的副本,因为它们已按位置排序
陆地动物=新的ArrayList(动物);
陆地动物。排序(比较器。比较(动物::getLandOrder));
waterAnimals=新ArrayList(动物);
waterAnimals.sort(Comparator.comparing(Animal::getWaterOrder));
}
公共列表getLandAnimals(){
归还陆生动物;
}
公共列表getWaterAnimals(){
归还水生动物;
}
}

现在在需要列表的地方注入
AnimalService
,并使用getter。

@Hamid这有帮助吗?我需要将它们注入不同的bean中,因此这需要在框架级别处理。我能想到的解决方案是在“@”配置类中用“@”Bean显式地准备这些列表,然后注入它们。根据条件更改“@”订单值似乎不可能。反转可能无法完全解决此问题。将来我可能会有更多的豆子,而且顺序可能会改变。基本上,我需要更大的灵活性来定义顺序,这样将来我就不会被单一(包括反向)顺序所束缚。@Hamid您可以编写自己的比较器,只针对这种情况进行反向操作。注意:
sort
修改列表(在本例中是单例bean),因此,任何其他使用列表/bean的组件都将具有相同的顺序。@如果您错了,其他使用此bean/列表顺序的组件不会改变,您可以尝试一下。您是说集合作为原型(每个请求的单独实例)而不是单例(所有请求的单个实例),这是默认的?你能给我看一下那方面的文件吗?