使用java按指定顺序排列arrayList的值

使用java按指定顺序排列arrayList的值,java,arraylist,Java,Arraylist,我试图为下面的场景找到一个更好、优化的解决方案 我有一个数组列表 ArrayList<Order> orders = new ArrayList<Order>(); 我有一个所有这些项目的枚举 public Enum Items{ PILLOW("pillow"), HARDDISK("harddisk"), MILK("milk"), SOAP("soap"), MEDICINE("medicine"), TOY("toy") }

我试图为下面的场景找到一个更好、优化的解决方案 我有一个数组列表

ArrayList<Order> orders = new ArrayList<Order>();  
我有一个所有这些项目的枚举

public Enum Items{  
PILLOW("pillow"),  
HARDDISK("harddisk"),  
MILK("milk"),  
SOAP("soap"),  
MEDICINE("medicine"),  
TOY("toy")    
}
我的输出顺序应该如下

{    
milk,  
milk,  
harddisk,  
medicine,  
medicine,  
toy,  
soap,  
pillow  
}  
为了做到这一点,我所要做的就是

ArrayList<Order> resultList = new ArrayList<Order>();  
for(Order order: orders){  
if(order.getItemName.equals(Items.MILK){  
resultList.add(order);  
}    

for(Order order: orders){    
if(order.getItemName.equals(Items.MEDICINE){  
resultList.add(order);    
}  

.......  

for(Order order: orders){  
if(order.getItemName.equals(Items.PILLOW){  
resultList.add(order);  
}  
如果我遵循上面的方法,我能够按照上面指定的顺序获得输出顺序,但我关心的是,因为我在这里循环了许多for循环,所以我希望得到优化方法的建议

输出应按照以下顺序在中排序

一杯牛奶 2硬盘 3医学 4玩具 5肥皂
6.与此相反,您可以使用Collectionssortlist,comparator,在这里您可以传递自定义比较器以按特定顺序获得结果

Collections.sort(list, new Comparator<Order>() {

    @Override
    public int compare(Order obj1, Order obj2) {
         // write the custom logic 
         // a negative integer, zero, or a positive integer as the first argument
         // is less than, equal to, or greater than the second
         return 0;
    }
});

枚举具有自然顺序,即枚举成员声明的顺序。因此,如果需要指定的顺序,则应将枚举声明为:

public Enum Item {  
    MILK("milk"),  
    HARDDISK("harddisk"),  
    MEDICINE("medicine"),  
    TOY("toy"),
    SOAP("soap"),  
    PILLOW("pillow");    
}
然后你可以像这样对你的订单进行排序:

Collections.sort(orders, new Comparator<Order>() {
    @Override
    public int compare(Order o1, Order o2) {
        return o1.getItem().compareTo(o2.getItem());
    }
}); 
如果无法修改枚举,请使用以下技巧:

private static final List<Item> ITEMS_IN_ORDER = Arrays.asList(new Item[] {
    Item.MILK,  
    Item.HARDDISK,  
    Item.MEDICINE,  
    Item.TOY,
    Item.SOAP,  
    Item.PILLOW
});

...

Collections.sort(orders, new Comparator<Order>() {
    @Override
    public int compare(Order o1, Order o2) {
        return Integer.compare(ITEMS_IN_ORDER.indexOf(o1.getItem()),
                               ITEMS_IN_ORDER.indexOf(o2.getItem()));
    }
});

还有一种选择,将枚举类修改为

public Enum Items{ 
 MILK("milk",1),     
 HARDDISK("harddisk",2),
 MEDICINE("medicine",3),  
 TOY("toy",4)  
 SOAP("soap",5),  
 PILLOW("pillow",6), 

 private String name;
 private sortValue;


Items(double name, double sortValue) {
    this.name= name;
    this.sortValue= sortValue;
} 
}
使用比较器,根据排序值进行排序

Collections.sort(list,new Comparator<Fruit>() {

        public int compare(Items item1, Items item2) {
                   return item1.sortValue - item2.sortValue;

});

与JB Nizet相比,它的一个优点是它不依赖于在Enum类中声明值的顺序

为什么您会期望该输出?这不是自然的分类。您希望在什么基础上执行排序?此答案使用自定义比较器处理枚举:我欣赏上述方法,但我已经有了按升序排序的orders arrayList。我所要做的就是按照定制的排序顺序输出结果,即1牛奶2硬盘3药品4玩具5肥皂6枕头要获得定制的排序,我们使用Comparator。我们可以编写自定义逻辑来获得排序。此外,我在列表中有重复的值我很欣赏,但在我的场景中,此枚举是通用的,我的意思是它也用于其他模块,我不能让它为一个modulegood工作……但约束条件是我正在使用其他人的jar文件……我不应该对他们现有的代码做任何更改……我只想从我的角度更好地实现
Collections.sort(list,new Comparator<Fruit>() {

        public int compare(Items item1, Items item2) {
                   return item1.sortValue - item2.sortValue;

});