Java 对对象列表进行排序和筛选
我定义了一个Java 对对象列表进行排序和筛选,java,collections,Java,Collections,我定义了一个产品类,如下所示: public class Product { String name; ProductType type; BigDecimal price; // Getters and Setters omitted } 使用ProductType作为enum类: public enum ProductType { APPLE, PEAR, BANANA } 现在我已经创建了一个列表,在那里我添加了各种产品。我想做的是能够排序这个名
产品类,如下所示:
public class Product {
String name;
ProductType type;
BigDecimal price;
// Getters and Setters omitted
}
使用ProductType
作为enum
类:
public enum ProductType {
APPLE, PEAR, BANANA
}
现在我已经创建了一个列表
,在那里我添加了各种产品。我想做的是能够排序这个名单上的价格和过滤它的类型
实现这种行为的标准方法是什么?通常,您可以在类上使用集合.sort
方法和实现可排序
。或者您可以使用更现代的流式API,它提供了更精简的编程接口,并允许进行自动优化,例如简化多处理器。标准Java库提供了集合。sort()
用于一次排序,而树集
和树映射
用于永久排序的集合。除了@MatthiasSteinbauer answer,您还可以对和使用Java 8流
分类:
products.stream()
.sorted((p1, p2) -> p1.getPrice().compareTo(p2.getPrice())).collect(toList());
筛选:
products.stream().filter(p -> p.getType().equals(givenType)).collect(toList());
在Java 8中:
List<Product> products = // ...
List<Product> filterSortedProdycts =
products.stream()
.filter(p -> p.getType() == ProductType.BANANA) // only keep BANANA
.sorted(Comparator.comparing(Product::getPrice)) // sort by price
.collect(Collectors.toList());
列出产品=/。。。
列表过滤器SortedProdyCts=
products.stream()
.filter(p->p.getType()==ProductType.BANANA)//只保留香蕉
.sorted(Comparator.comparing(Product::getPrice))//按价格排序
.collect(Collectors.toList());
Collections.sort是标准方式
您也可以使用图书馆:
使用Java 8查看一下这个,我认为以下是按类型筛选和按价格排序的最标准方法:
Stream<Product> results = products.stream()
.filter(p -> p.getType() == ProductType.BANANA)
.sorted((l, r) -> l.getPrice().compareTo(r.getPrice()));
Stream results=products.Stream()
.filter(p->p.getType()==ProductType.BANANA)
.sorted((l,r)->l.getPrice().compareTo(r.getPrice());
在缺少流和lambda的Java7中,我建议使用。为此,应采取以下措施:
ImmutableList<Product> results = FluentIterable.from(products).filter(new Predicate<Product>() {
@Override
public boolean apply(Product input) {
return input.getType() == ProductType.BANANA;
}
}).toSortedList(new Comparator<Product>() {
@Override
public int compare(Product o1, Product o2) {
return o1.getPrice().compareTo(o2.getPrice());
}
});
ImmutableList results=fluenterable.from(products).filter(new Predicate()){
@凌驾
公共布尔应用(产品输入){
返回input.getType()==ProductType.BANANA;
}
}).toSortedList(新比较器(){
@凌驾
公共整数比较(产品o1、产品o2){
返回o1.getPrice().compareTo(o2.getPrice());
}
});
为了可读性,我可能会将匿名内部类重构为命名类
请注意,在这两种情况下,都会创建一个包含结果的新列表。是的,您会使产品实现具有可比性,以便它们可以相互比较sorted@cricket_007六羟甲基三聚氰胺六甲醚。。。我不会让产品
实现可比
接口。类应该只在其实例具有自然顺序的情况下实现它。这对于这里的产品来说可能有点困难。更好:有一个或多个可用于排序的比较器。@seelenvirtuse同意,排序可以通过任何属性实现。我只是说,这是实现对集合进行排序行为的标准方法。这相当模糊。您是否可以编辑此文件以添加解决此问题的相关代码示例?仅仅链接到其他网站的页面是不可接受的。