0

我试图为以下场景找到更好和优化的解决方案
我有一个 arrayList

ArrayList<Order> orders = new ArrayList<Order>();  

排序后的结果值如下

    {  
     medicine,    
     medicine,  
     milk,    
     milk,    
     pillow,  
     Soap,         
     toy       
}  

我对所有这些项目都有一个 ENUM

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 循环,我想要优化方法的建议。

输出应按以下顺序排序

1) 牛奶 2) 硬盘 3) 药品 4) 玩具 5) 肥皂 6) 枕头

4

3 回答 3

4

取而代之的是,您可以使用Collections#sort(list,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;
    }
});
于 2013-02-16T18:48:15.023 回答
3

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

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()));
    }
});
于 2013-02-16T18:51:48.187 回答
0

那么另一种选择,将您的枚举类修改为

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 类中声明值的顺序

于 2013-02-16T18:59:03.487 回答