需要从列表中删除重复项

时间:2018-04-29 14:40:09

标签: java

我在ArrayList中有一个对象列表。我想根据旧的paymentDate删除列表中的重复对象。例如,如果成员(Vishal)重复两次,我需要删除基于旧的Vishal对象来自列表的paymnetDate。

[{CreditCardNum,name,Amount,DueDate,PaymentDate}]

masterlist = [{4123456789123456,Vishal,80000,03/06/2015,07/06/2015},
              {4123456789123456,Vivek,80000,07/06/2015,11/06/2015},
              {4123456789123456,Vishal,80000,03/06/2015,09/06/2015}];


Removable Object from List = 
  {4123456789123456,Vishal,80000,03/06/2015,07/06/2015}

List<CreditcardVo> masterlist =new ArrayList<CreditcardVo>();
public class CreditCardVO {
   public String creditNumber;
   public String name;
   public int  amount;
   public Date dueDate;
   public Date paymentDate;
   public String getCreditNumber() {
          return creditNumber;

   }
   public void setCreditNumber(String creditNumber) {
          this.creditNumber = creditNumber;
   }
   public String getName() {
          return name;
   }
   public void setName(String name) {
          this.name = name;
   }
   public int getAmount() {
          return amount;
   }
   public void setAmount(int amount) {
          this.amount = amount;
   }
   public Date getDueDate() {
          return dueDate;
 }
   public void setDueDate(Date dueDate) {
          this.dueDate = dueDate;
   }
   public Date getPaymentDate() {
          return paymentDate;
   }
  public void setPaymentDate(Date paymentDate) {
      this.paymentDate = paymentDate;``
   }
}

2 个答案:

答案 0 :(得分:1)

以下是您可以使用的算法: 首先,您需要ArrayList中每个对象的唯一标识符。如果您确定该名称不重复,则标识符可以是我的名称。

  • 步骤1:创建一个空映射,其中键是对象标识符,值将是对象本身
  • 步骤2:对于每个元素,在ArrayList中:
    • 检查地图是否包含对象的标识符
    • 如果是,则获取与地图中该标识符相关联的值val,并将其日期与当前对象curr的日期进行比较:
      • 如果val有最新日期,则不执行任何操作
      • 如果curr有最新日期,请致电map.put(identifier, curr)以更新地图中的值
    • 如果不是,则map.put(identifier, curr)将当前对象添加到地图

最后,结果将是地图的值。您可以使用map.values()

来实现这一目标

答案 1 :(得分:0)

您可以创建一个方法:

List<CreditCardVO> getDistinctObjectsByName(List<CreditCardVO> cardVOS){
         Collection<CreditCardVO> resultSet = 
          cardVOS.stream()
                 .collect(Collectors.toMap(CreditCardVO::getName, Function.identity(),
                         (left, right) ->
                             left.getPaymentDate().after(right.getPaymentDate()) ?
                                  left : right
                 )).values();
         return new ArrayList<>(resultSet);
}
给出CreditCardVO列表的

将返回一个包含最新付款日期的不同对象的新列表。