使用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;
});