我有一个Item对象的集合,类Item如下->
class Item {
String id;
String brand;
Integer price;
Date publishedDate;
}
现在,我要根据用户输入进行排序。用户可以根据自己的选择(如品牌、价格或发布日期)对其进行排序,甚至可以使用多个参数。比如品牌和价格或者价格和发布日期。
我得到了一些使用策略设计模式的提示,但无法在这里实现来解决它。
您可以为每个字段使用一个比较器的静态映射,并从中构建一个组合比较器:您仍然必须使比较器为空安全,并检查字段名称。
class Item {
String id;
String brand;
Integer price;
Date publishedDate;
public Item(String id, String brand, Integer price, Date publishedDate) {
super();
this.id = id;
this.brand = brand;
this.price = price;
this.publishedDate = publishedDate;
}
static Map<String, Comparator<Item>> comparatorMap = new HashMap<String, Comparator<Item>>() {
{
put("id", new Comparator<Item>() {
@Override
public int compare(Item o1, Item o2) {
return o1.id.compareTo(o2.id);
}
});
put("brand", new Comparator<Item>() {
@Override
public int compare(Item o1, Item o2) {
return o1.brand.compareTo(o2.brand);
}
});
put("price", new Comparator<Item>() {
@Override
public int compare(Item o1, Item o2) {
return o1.price.compareTo(o2.price);
}
});
put("publishedDate", new Comparator<Item>() {
@Override
public int compare(Item o1, Item o2) {
return o1.publishedDate.compareTo(o2.publishedDate);
}
});
}
};
@Override
public String toString() {
return "Item [id=" + id + ", brand=" + brand + ", price=" + price + ", publishedDate=" + publishedDate + "]";
}
static class ItemComparator implements Comparator<Item> {
private List<Comparator<Item>> comparators;
ItemComparator(String... fields) {
comparators = new ArrayList<>();
for (String field : fields) {
comparators.add(comparatorMap.get((field)));
}
}
@Override
public int compare(Item o1, Item o2) {
int result = 0;
for (Comparator comparator : comparators) {
result = comparator.compare(o1, o2);
if (result != 0) {
return result;
}
}
return result;
}
}
static List<Item> sort(List<Item> list, String... fields) {
Collections.sort(list, new ItemComparator(fields));
return list;
}
public static void main(String[] args) {
List<Item> list = new ArrayList<>();
list.add(new Item("B", "A", 5, new Date()));
list.add(new Item("A", "B", 7, new Date()));
sort(list, "id", "price");
System.out.println(list);
}
}
问题内容: 我有一个对象的ArrayList。该对象包含属性和。所以我想对上的对象进行排序,对于同一日期的所有对象,我想对其进行排序。我怎样才能做到这一点? 问题答案: 实施自定义,然后使用。它可能看起来像这样:
问题内容: 我有一个清单清单: 如果要按一个元素(例如,高/短元素)排序,可以通过进行。 如果我想作为排序依据两个高大和颜色,我可以为每个元素做排序两次,一次,但有一个更快的方法? 问题答案: 键可以是返回元组的函数: 或者,你可以使用来实现相同的效果(速度更快,并且避免了Python函数调用): 并请注意,你可以在此处使用而不是使用,然后重新分配:
我读过关于使用比较器对数组列表进行排序的文章,但在所有示例中,人们都使用了,根据一些研究,这是一种用于字符串的方法。 我希望按照自定义对象的属性之一对其ArrayList进行排序:日期对象()。通常我会通过来比较它们,所以我想知道我是否可以写出如下内容:
我试过了,但不起作用,二进制运算符'>'不能应用于两个'double?‘操作数 做这件事最方便快捷的方法是什么?
问题内容: 我有以下收藏: 当这个样子的: 现在我必须根据字段对集合进行排序,如何实现呢? 问题答案: 这是我的“ 1班轮”: Java 8的更新:对于int数据类型 甚至: 对于String数据类型(如注释中所示) ..它期望吸气剂
问题内容: 如何根据自定义属性排序ArrayList中的对象? 问题答案: 从实现,它就有一个像方法一样的方法。 因此,你的自定义设置应如下所示: 该方法必须返回一个,因此无论如何你都无法直接返回一个你计划中的。 你的排序代码几乎就像你写的那样: 如果你不需要重用比较器,则编写所有这些内容的一种更短的方法是将其编写为内联匿名类: 自从Java-8 现在,你可以通过使用lambda表达式来以较短的形