2016-04-29 111 views
0

列表我定义了一个Product类是这样的:排序和过滤对象

public class Product { 
    String name; 
    ProductType type; 
    BigDecimal price; 
    // Getters and Setters omitted 
} 

随着ProductType作为enum类:

public enum ProductType { 
    APPLE, PEAR, BANANA 
} 

现在我已经创建了一个List<Product>,我添加了所有种类的产品。我想要做的是能够按价格对此列表进行分类并按类型对其进行过滤。

实现这种行为的标准方法是什么?

+1

是的,你使产品实现可比较,所以他们可以排序 –

+2

@ cricket_007嗯......我不会让'Product'实现'Comparable'接口。类只应实现,如果它有实例的_natural订单。这里可能对产品有些困难。更好:有一个或多个可用于排序的“比较器”。 – Seelenvirtuose

+1

@Seelenvirtouse同意,排序可以通过任何属性来实现。我只是说这是一种标准的方式来实现对集合进行排序的行为 –

回答

4

在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()); 
0

一般而言,您可以使用Collections.sort方法,并在您的课程上实施Sortable。或者您使用更现代的流媒体API,它提供更简化的编程接口,并允许自动优化,例如促进多个处理器。

0

标准Java库提供Collections.sort()用于一次性排序,TreeSetTreeMap用于永久排序的集合。

1

除了@MatthiasSteinbauer的答案,您可以使用Java 8的流为sortingfiler

排序:

products.stream() 
     .sorted((p1, p2) -> p1.getPrice().compareTo(p2.getPrice())).collect(toList()); 

过滤:

products.stream().filter(p -> p.getType().equals(givenType)).collect(toList()); 
+0

这非常含糊。你可以编辑这个来添加解决问题的相关代码示例吗?只是链接到其他网站上的网页是不被接受的。 – Kenster

+0

@Kenster完成!谢谢你的评论! –

1

使用Java 8看看,我下面会说是类型过滤最标准的方法和价格排序:

Stream<Product> results = products.stream() 
      .filter(p -> p.getType() == ProductType.BANANA) 
      .sorted((l, r) -> l.getPrice().compareTo(r.getPrice())); 

在Java 7中,缺少Streams和Lambdas,我会推荐使用Google Guava。以下将工作:

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()); 
    } 
}); 

我可能会将匿名内部类重构为命名类以提高可读性。

请注意,在这两种情况下都会创建一个包含结果的新列表。