2016-04-29 2 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'. Классы должны реализовывать только это, если существует натуральный порядок_ его экземпляров. Это может быть несколько сложно для продуктов, здесь. Лучше: используйте один или несколько «Компараторов», которые можно использовать для сортировки. – 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() для однократной сортировки и TreeSet и TreeMap для постоянно отсортированных коллекций.

1

В дополнение к ответу @MatthiasSteinbauer, вы можете использовать поток Java 8 для sorting и filer.

Сортировка:

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 сделано! Спасибо за ваше замечание! –

0

Collections.sort является стандартным способом

Вы также можете использовать Guava библиотека:

Взгляните на этот StackOverflow question

1

Использование Java 8, я хотел бы сказать следующее является наиболее стандартным методом фильтрации по типу и сортировка по цене:

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

В Java 7, в котором отсутствуют потоки и Лямбда, я бы рекомендовал использовать 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()); 
    } 
}); 

я бы, вероятно, реорганизовать анонимные внутренние классы в именованные классы для удобства чтения.

Обратите внимание: в обоих случаях создается новый список с результатами.

Смежные вопросы