使用java以特定顺序排列arrayList的值

时间:2013-02-16 18:45:07

标签: java arraylist

我正在尝试为以下场景找到更好的优化解决方案 我有一个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)枕头

3 个答案:

答案 0 :(得分: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;
    }
});

答案 1 :(得分: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()));
    }
});

答案 2 :(得分: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类中声明值的顺序