2012-03-13 6 views
1

J'essaie de filtrer le panier ci-dessous en fonction de la méthode de paiement. Le panier contient la liste des groupes qui contiennent une liste d'articles et d'articles avec une liste de méthodes de paiement.Filtrage des collections dans Java

Maintenant, je veux tous les articles avec la méthode de paiement offerts comme carte de crédit. Existe-t-il un meilleur moyen de filtrer plutôt que de parcourir les boucles imbriquées?

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

Merci,

-Vijay

+1

type de paiement devrait vraiment être une chaîne, plutôt que d'un ENUM? – kittylyst

+0

Le paiement est déterminé en tant que chaîne. L'objet entier du panier et d'autres font partie du type de données complexe dans ma demande de service WSDL. –

Répondre

1

Cela dépend de ce que vous entendez par mieux.

Vous pouvez gérer une HashMap qui stocke cette information. Ceci évite d'utiliser des boucles mais signifie que vous devez maintenir une structure de données qui ajoute de la complexité et pourrait être plus lente dans l'ensemble, selon la façon dont vous l'utilisez.

Sans plus d'informations, je prendrais l'approche la plus simple/la plus courte qui consiste à utiliser des boucles.

+0

En fait, l'objet cart est un type complexe dans ma demande de service WSDL. Je dois trier la liste et identifier les articles admissibles en fonction des règles fournies. Une telle règle est "Tous les articles avec carte de paiement passerelle de paiement". J'ai plus de règles à appliquer sur le panier :) mais la structure de données est celle définie. –

+0

Pour chaque type de requête, vous devrez peut-être ajouter plus de structures de données pour mettre en cache les résultats. Ou si vous utilisez la force brute, ce sera plus simple, peut-être plus lent (mais peut-être plus que rapide). Vous pouvez boucler 100.000 éléments en quelques millisecondes, donc la boucle peut être une option même si la performance est importante. –

0

Je voudrais ajouter des méthodes à chaque classe pour trouver les objets qui vous intéressent, par exemple. une méthode List<Item> findItemsByPaymentType(PaymentType paymentType) à chaque Group et Cart. Celui de Cart appelle alors celui de la classe Group pour chacune de ses instances de groupe, puis collecte tous les résultats du groupe unique dans une liste combinée. Cela impliquerait toujours que vous deviez implémenter des boucles, mais cela se ferait d'une manière agréable et propre dans chaque classe. Plus facile à tester et plus facile à réutiliser.

+0

L'objet panier fait partie de ma demande de service et est généré automatiquement :( –

+0

Eh bien, c'est dommage - cela aurait été une bonne occasion pour un vrai design OO. Dans ce cas, je mettrais la fonctionnalité de filtre (boucles) dans une sorte de classe d'aide pour une réutilisation plus facile.Vous vous remercierez le moment où vous devez l'utiliser d'un autre endroit. – nwinkler

0

Une approche consiste à rendre le PaymentType abstrait avec quelques méthodes courantes. Ensuite, vous créez des sous-classes telles que CreditCardPayment extends PaymentType qui vous permettront de faire quelque chose comme suit:

for(CreditCardPayment payment : payments) 
{ 
    ccpList.add(payment); 
}