我也在寻找可以合并for循环的潜在方法。
我自己学习Java,但对如何按类型然后按价格对下面的数组进行排序感到非常困惑。这个问题与之前发布的问题不同,因为标记的问题仅涉及字符串,而我的问题使用的是int,String和double的组合。在撰写自己的帖子之前,我在Overflow上查看的所有以前的帖子都没有涉及到双打。
这就是我对Item的定义。
public Item(int type, String name, double quantity, double price) {
this.type = type;
this.name = name;
this.quantity = quantity;
this.price = price;
}
这是我的数组:
public static void main ()
{Item [] shoppingItems = {new Item(2,"Cherry",9,1.35),
new Item(3,"Orange Juice",4,5.29),
new Item(5,"Hand Soap",2,1.77),
new Item(6,"Tooth Brush",3,4.55),
new Item(4,"Cupcake",3,2.95),
new Item(1,"Red Tomato Sauce",5.5,2.35),
new Item(3,"Chicken",1.9,2.48),
new Item(3,"Apple Pie",2,3.99),
new Item(7,"Bug Spray",1,9.28),
new Item(3,"Roast Beef",2.82,5.99),
new Item(5,"Light Bulb",3,3.92),
new Item(4,"Cookies",0.2,2.96),
new Item(2,"Watermelon",1.8,2.29)
};
}
如何按类型升序对该数组排序?还有价格?
我研究了使用比较器,但是它们似乎没有达到我的目标。我也不确定,因为价格是两倍。
答案 0 :(得分:2)
您可以使用Collections.sort
方法执行此操作。只需通过以下自定义Comparator
实现即可。
List<Item> list = Arrays.asList(shoppingItems);
Collections.sort(list, new Comparator<Item>() {
@Override
public int compare(Item item1, Item item2) {
int typeCompareResult = Integer.compare(item1.type, item2.type);
if (typeCompareResult != 0) {
return typeCompareResult;
} else {
return Double.compare(item1.price, item2.price);
}
}
});
编辑:这是老派的做事方式。首先,这很好,但是最终利用Java 8中添加的Comparator.comparingInt
更为简洁。请参阅KaNa0011的answer
检查Object ordering以获得更多清晰度。
答案 1 :(得分:1)
您可以使用通过链接Comparator.comparing(...)
调用创建的自定义比较器对象对它们进行排序。
Comparator<Item> itemComparator = Comparator
.comparingInt(Item::getType)
.thenComparingDouble(Item::getPrice);
Arrays.sort(soppingItems, itemComparator);
答案 2 :(得分:0)
List<Item> list = Arrays.asList(shoppingItems);
Collections.sort(list,Comparator.comparingInt(Item::getType));
System.out.println(list.toString());
假设您为getType()
类定义了相应的toString()
和Item
答案 3 :(得分:-1)
Collections.sort()应该能够为您提供帮助。
请查看这篇文章(根据用户定义的标准对ArrayList进行排序。): https://www.geeksforgeeks.org/collections-sort-java-examples/