大家好!
我有一个问题,关于如何以最美观、最正确List<>的方式按值排列排序。
我没有找到任何具体的术语来指定这种排序,所以我称之为“按值”(如果有人认为它可以更富有表现力地调用,那么欢迎你)。
那么重点是什么:
有一堂课Product
@Data
public class Product {
/**
* Тип продукта
*/
private ProductType productType;
/**
* Доступность продукта (продукт может быть временно заблокирован и не доступен)
*/
private Boolean isAvailable;
private enum ProductType {
NEW,
OLD,
REMOVED,
UNUSED,
EXCLUSIVE
}
}
假设这个类存储在数据库中,当我从那里取出它时,我得到它List<Product>,然后我必须以FRONTEND排序的形式返回它。
客户提出了要求。
列表中的顺序应如下所示:
- ProductType == 独家AND isAvailable=true
- ProductType == NEW AND isAvailable=true
- ProductType == OLD AND isAvailable=true
- ProductType == 未使用AND isAvailable=true
- ProductType == 已移除且isAvailable =true
- isAvailable=false 的所有剩余产品
问题很紧迫:如何正确组织这种排序。
如果您想知道这种排序的含义,那么这应该不是您关心的问题。您收到了这些要求,您需要按照要求进行操作。
我有一个想法来做这样的事情,即Product通过添加一个确定优先级的方法来使类现代化,然后使用Comparator.
@Data
public class Product {
/**
* Тип продукта
*/
private ProductType productType;
/**
* Доступность продукта (продукт может быть временно заблокирован и не доступен)
*/
private Boolean isAvailable;
public int getPriority() {
if (productType.equals(ProductType.EXCLUSIVE) && BooleanUtils.isTrue(isAvailable)) {
return 1;
} else if (productType.equals(ProductType.NEW) && BooleanUtils.isTrue(isAvailable)) {
return 2;
} else if (productType.equals(ProductType.OLD) && BooleanUtils.isTrue(isAvailable)) {
return 3;
} else if (productType.equals(ProductType.UNUSED) && BooleanUtils.isTrue(isAvailable)) {
return 4;
} else if (productType.equals(ProductType.REMOVED) && BooleanUtils.isTrue(isAvailable)) {
return 5;
}
return 6;
}
private enum ProductType {
NEW,
OLD,
REMOVED,
UNUSED,
EXCLUSIVE
}
}
用法
private static Comparator<Product> PRODUCT_SORT = Comparator.comparing(Product::getPriority)
.reversed();
但或许还有更简洁的方式,所以请大家提供自己的版本。
您可以制作具有所需元素顺序的数组,并在排序时按索引进行比较
事实是,了解这些要求为何如此重要非常重要。在这种情况下,特别重要的是,顺序仅在此特定场景中很重要,或者是由于产品类型在任何场景中的“重要性”顺序。我在这里使用“重要性”这个词,但使用这个主题领域中使用的词会更正确。
如果域模型匹配它,实现将更加正确和更好。在这种情况下,在实践中,这意味着如果产品类型本身具有“重要性”(或“优先级”),无论场景如何,那么在模型中明确表达这一点是有意义的,这可以通过向枚举添加一个字段:
如果排序顺序取决于场景,那么
getPriority放在Product. 最好像这样设置脚本的顺序: