2012-03-13 2 views
1

Я пытаюсь отфильтровывать следующую корзину на основе способа оплаты. В корзине содержится список группы, в которой в списке содержится список предметов и предметов, которые имеют список способов оплаты.Фильтровать коллекции java

Теперь, я хочу все детали с предлагаемым платежом как кредитной карточкой. Есть ли лучший способ отфильтровать его, а не работать через вложенные циклы.

public class PaymentType { 
    private String paymentType; 
} 

public class Items { 
    private Integer itemId; 
    private List<PaymentType> paymentOptions; 
} 

public class Group { 
    private Integer sellerId; 
    private List<Items> itemList; 
} 

public class Cart { 
    private Integer cardId; 
    private List<Group> group; 
} 

Спасибо,

-Vijay

+1

Должен ли тип оплаты действительно является String, а не перечисление? – kittylyst

+0

Оплата определяется как Строка. Весь объект тележки и другие объекты являются частью сложного типа данных в моем запросе службы WSDL. –

ответ

1

Это зависит от того, что вы имеете в виду лучше.

Вы можете сохранить HashMap, который хранит эту информацию. Это позволяет избежать использования циклов, но означает, что вам необходимо поддерживать структуру данных, которая добавляет сложности и может быть более медленной в целом, в зависимости от того, как вы ее используете.

Без дополнительной информации я бы взял самый простой/короткий подход, который должен использовать циклы.

+0

На самом деле объект тележки является сложным типом в моем запросе службы WSDL. Я должен отсортировать список и определить подходящие элементы на основе предоставленных правил. Одним из таких правил является «Все предметы с платежной шлюзовой кредитной картой». У меня есть больше правил для подачи на тележку :), но структура данных определена. –

+0

Для каждого типа запросов может потребоваться добавить дополнительные структуры данных для кэширования результатов. Или, если вы используете грубую силу, это будет проще, возможно, медленнее (но, возможно, более чем достаточно быстро). Вы можете прокручивать 100 000 элементов за миллисекунды, поэтому циклирование может быть вариантом, даже если производительность важна. –

0

Я бы добавил методы для каждого класса, чтобы найти интересующие вас объекты, например. метод List<Item> findItemsByPaymentType(PaymentType paymentType) для каждого Group и Cart. Затем в Cart вызывается один из классов Group для каждого из его экземпляров группы, а затем собирает все отдельные результаты группы в одном объединенном списке.

Это все равно означает, что вам нужно реализовать циклы, но это будет сделано красивым и чистым способом в каждом классе. Легче тестировать и легче использовать.

+0

Объект тележки является частью моего запроса на обслуживание и сгенерирован автоматически :( –

+0

Ну, это слишком плохо - это был бы хороший шанс для какого-то реального дизайна OO. В этом случае я бы включил функциональность фильтра (петли) в какой-то вспомогательный класс для более простого повторного использования. Вы будете благодарны вам, когда вам нужно будет использовать его из другого места. – nwinkler

0

Один из подходов состоит в том, чтобы сделать реферат PaymentType с помощью некоторых распространенных методов. Затем вы создаете подклассы, такие как CreditCardPayment extends PaymentType, которые позволят вам сделать что-то вроде следующим образом:

for(CreditCardPayment payment : payments) 
{ 
    ccpList.add(payment); 
} 
Смежные вопросы