Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对对象列表进行排序和筛选_Java_Collections - Fatal编程技术网

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同意,排序可以通过任何属性实现。我只是说,这是实现对集合进行排序行为的标准方法。这相当模糊。您是否可以编辑此文件以添加解决此问题的相关代码示例?仅仅链接到其他网站的页面是不可接受的。