gpt4 book ai didi

java - 如何创建具有动态规则的比较器?

转载 作者:行者123 更新时间:2023-11-30 05:36:18 26 4
gpt4 key购买 nike

我需要根据过滤器列表对项目列表进行排序,过滤器列表按优先级排序。但是,这些过滤器来自 API 请求正文,因此它们可以更改。

我有一个过滤器类

public class Filter {
private String fieldName;
private String order;

// Getters and Setters...
}

一些过滤对象

Filter filter1 = new Filter("price", "desc");
Filter filter2 = new Filter("size", "asc");

我的 Item 类是这样的:

public class Item {
private String productName;
private double size;
private double price;

// Getters and Setters...
}

然后我必须像这样对项目进行排序:

如果一个 Item.price 等于下一个 Item,则比较它们的大小,依此类推...

我已经尝试为每个过滤器创建一个比较器,但我无法链接它们,因此每个过滤器都会自行对列表进行排序,而不考虑以前的排序方法(有时将整个列表颠倒过来)。

我还尝试在 Item 类上实现 Comparable 接口(interface),但接口(interface)方法 compareTo 只接受单个参数(下一个 Item),而不接受规则列表。

因此给定一个项目列表,例如

List<Item> items = new ArrayList<Item>(
new Item("foo", 10.0, 5.0),
new Item("bar", 6.0, 15.0),
new Item("baz", 7.0, 5.0)
);

以及过滤器列表,例如

List<Filter> filters = new ArrayList<Filter>(
new Filter("price", "desc"),
new Filter("size", "asc")
);

我希望结果是

List<Item> sortedItems = new ArrayList<Item>(
new Item("bar", 6.0, 15.0),
new Item("baz", 7.0, 5.0),
new Item("foo", 10.0, 5.0)
);

你能帮我一下吗?提前致谢!

重要提示:我对字段本身的比较没有问题。我的问题是制作一个动态比较器,根据过滤器列表更改其比较。

最佳答案

我相信以下内容应该会插入您在链接给定变量过滤器比较的项目的比较器方面朝着正确的方向发展。它使用反射来调用 getter 并假设比较是与 double 进行的。

如果不能保证它们是 double ,则调整反射转换以转换到适用于所有用例的东西。

PropertyUtils.getProperty() 是 Apache Commons BeanUtils 的一部分,可以由您选择获取值来替换,无论是通过反射还是静态比较器。

public class Filter {

// properties, constructors, getters, setters ...

public Comparator<Item> itemComparator() {
return (item1, item2) -> {
Double val1 = (Double) PropertyUtils.getProperty(item1, fieldName);
Double val2 = (Double) PropertyUtils.getProperty(item2, fieldName);
return (order.equals("asc") ? val1.compareTo(val2) : val2.compareTo(val1);
};
}

public static Comparator<Item> chainedItemComparators(List<Filter> filters) {
return filters.stream()
.map(Filter::itemComparator)
.reduce((item1, item2) -> 0, (f1, f2) -> f1.thenComparing(f2));
}
}

然后使用链式比较器:

public static void main(String[] args) {
List<Filter> filters = new ArrayList<>(Arrays.asList(
new Filter("price", "desc"),
new Filter("size", "asc")
));
List<Item> items = new ArrayList<>(Arrays.asList(
new Item("bar", 6.0, 15.0),
new Item("baz", 7.0, 5.0),
new Item("foo", 10.0, 5.0)
));
items.sort(Filter.chainedItemComparators(filters));
}

关于java - 如何创建具有动态规则的比较器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56535144/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com