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