【问题标题】:Filtering collections in java在java中过滤集合
【发布时间】:2012-03-29 23:28:11
【问题描述】:

我正在尝试根据付款方式过滤以下购物车。 购物车包含 Group 列表,其中包含 Item 列表,并且 item 具有付款方式列表。

现在,我想要所有使用信用卡付款方式的商品。有没有更好的方法来过滤它而不是通过嵌套循环运行。

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

谢谢,

-维杰

【问题讨论】:

  • 支付类型真的应该是字符串,而不是枚举吗?
  • 付款被确定为字符串。整个购物车对象和其他对象是我的 WSDL 服务请求中复杂数据类型的一部分。

标签: java collections filtering


【解决方案1】:

一种方法是使用一些常用方法将 PaymentType 抽象化。然后您创建子类,例如 CreditCardPayment extends PaymentType,这将使您能够执行以下操作:

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

【讨论】:

    【解决方案2】:

    我会为每个类添加方法来查找您感兴趣的对象,例如一个方法List&lt;Item&gt; findItemsByPaymentType(PaymentType paymentType) 到每个GroupCart。然后,Cart 中的那个会为其每个 Group 实例调用 Group 类上的那个,然后将所有单个 Group 结果收集到一个组合列表中。

    这仍然意味着您必须实现循环,但它会在每个类中以一种简洁明了的方式完成。更容易测试,更容易重复使用。

    【讨论】:

    • 购物车对象是我的服务请求的一部分并且是自动生成的:(
    • 嗯,这太糟糕了——这对于一些真正的 OO 设计来说是一个很好的机会。在这种情况下,我会将过滤器功能(循环)放入某种辅助类中以便于重用。当您需要从其他地方使用它时,您会感谢自己。
    【解决方案3】:

    这取决于你所说的更好。

    您可以维护一个存储此信息的 HashMap。这避免了使用循环,但意味着您必须维护一个数据结构,这会增加复杂性并且总体上可能会变慢,具体取决于您使用它的方式。

    如果没有更多信息,我会采用最简单/最短的方法,即使用循环。

    【讨论】:

    • 实际上购物车对象是我的 WSDL 服务请求中的一个复杂类型。我将根据提供的规则整理清单并确定符合条件的项目。一个这样的规则是“所有带有支付网关信用卡的项目”。我有更多的规则要应用在购物车上:) 但数据结构是定义的。
    • 对于每种类型的查询,您可能需要添加更多的数据结构来缓存结果。或者,如果您使用蛮力,它会更简单,可能更慢(但可能足够快)您可以在几毫秒内循环遍历 100,000 个项目,因此即使性能很重要,也可以选择循环。跨度>
    猜你喜欢
    • 2016-07-26
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多