添加具有相同Date的ArrayList值

时间:2014-08-28 07:42:34

标签: java collections arraylist

我有一个像 -

这样的排序ArrayList
List<DD_Details> list = new ArrayList<DD_Details>();
list.add(new DD_Details(26/05/2014,3000.00));
list.add(new DD_Details(26/08/2014,6000.00));
list.add(new DD_Details(26/08/2014,2000.00));

DD_Details类是 -

class DD_Details {

    private Date ddSubmissionDate;
    private Double amount;

    public DD_Details(Date n, Double s) {
        this.ddSubmissionDate = n;
        this.amount = s;
    }

    public Date getDdSubmissionDate() {
        return ddSubmissionDate;
    }

    public void setDdSubmissionDate(Date ddSubmissionDate) {
        this.ddSubmissionDate = ddSubmissionDate;
    }

    public Double getAmount() {
        return amount;
    }

    public void setAmount(Double amount) {
        this.amount = amount;
    }

    public String toString() {
        return "ddSubmissionDate: " + this.ddSubmissionDate + "-- amount: "
                + this.amount;
    }
}

我只想添加相同日期的金额值并存储在新的ArrayList中。

我尝试了下面的代码,但它无法正常工作。

for (int i = 0; i < list.size(); i++) {
    Double amt = 0.0;
    Date date1 = list.get(i).getDdSubmissionDate();

    for (int j = i + 1; j < list.size(); j++) {

        if (date1.equals(list.get(j).getDdSubmissionDate())) {
             amt = amt + list.get(j).getAmount() + list.get(i).getAmount();
        } else {
              amt = list.get(i).getAmount();
        }
    }
    list1.add(new DD_Details(date1, amt));
 }

请给我一些提示来完成它。在此先感谢。

4 个答案:

答案 0 :(得分:4)

您可以改用下一个解决方案:

  List<DD_Details> list = new ArrayList<DD_Details>();
  List<DD_Details> list1 = new ArrayList<DD_Details>();
  list.add(new DD_Details(new Date(2014, 5, 26), 3000.00));
  list.add(new DD_Details(new Date(2014, 8, 26), 6000.00));
  list.add(new DD_Details(new Date(2014, 8, 26), 2000.00));

  for (DD_Details currentEl : list) // iterate over 'list'
  {
     DD_Details existingElement = null;
     for (DD_Details el1 : list1) // find element in 'list1' with the same date
     {
        if (el1.getDdSubmissionDate().equals(currentEl.getDdSubmissionDate()))
        {
           existingElement = el1;
           break;
        }
     }
     if (existingElement == null) // if element is not found in 'list1' then add current element to list
     {
        list1.add(currentEl); // or list1.add(new DD_Details(el.getDdSubmissionDate(), el.getAmount()))
     }
     else // if element is found, then increase amount
     {
        existingElement.setAmount(existingElement.getAmount() + currentEl.getAmount());
     }
  }

  // 'list1' contains what you need

答案 1 :(得分:1)

在内部for,当您为特定日期添加值时,else部分中存在错误。您尝试迭代给定日期的列表并添加所有值,直到日期不同。达到此条件后,您进入else并将总和设置为此给定日期的第一个元素的数量,因此您将覆盖已计算的总和。此外,对于具有相同日期的每个新元素,您要添加第一个日期的金额,这意味着如果同一日期有4个元素,则您将添加第一个金额的3倍。

您应该做的是,在进入第二个循环之前获取该给定日期的金额。最后一个考虑因素是,您将获得不同日期的不同金额,因为想象您有3个具有相同日期的元素,使用您正在使用的循环,您将从第一个开始,获得添加的3个元素的数量,然后转到第二个并获得第二个和第三个添加的数量,最后移动到最后一个并创建第三个元素,仅包含第三个元素的数量。因此,您应该创建一个我称为k的第三个变量,并存储包含相同日期的最后一个j值,然后将其添加到i并避免迭代一个元素您已处理的日期:

for (int i = 0; i < list.size(); i++) {
    Double amt = list.get(i).getAmount();
    Date date1 = list.get(i).getDdSubmissionDate();
    int k = 0;

    for (int j = i + 1; j < list.size(); j++) {

        if (date1.equals(list.get(j).getDdSubmissionDate())) {
            amt = amt + list.get(j).getAmount();
            k = j;
        }
    }
    list1.add(new DD_Details(date1, amt));
    i += k++;
}

答案 2 :(得分:1)

您的日期应为字符串文字。你编写它们的方式将是整数,并且都等于0。

显而易见的解决方案是将日期地图构建为金额(而不是列表),然后添加迭代地图的所有条目以构建列表。类似的东西:

  Map<Date, Double> amountPerDate = new HashMap<>();
  List<Date> dates = ...;
  List<Double> amounts = ...; // wherever those may come from
  for(int i = 0; i < dates.size(); i++) {
    Double currentAmount = amountPerDate.get(dates.get(i));
    double amount = currentAmount == null ? 0 : currentAmount;
    amountPerDate.put(dates.get(i), amount + amounts.get(i));
  }
  List<DD_Details> details = new ArrayList<>();
  for(Entry<Date, Double> e : amountPerDate) {
    details.put(new DD_Details(e.getKey(), e.getValue());
  }
  // optionally, you may Collections.sort(details); the list

在DD_Details类中,请考虑使用原始double而不是装箱Double

答案 3 :(得分:0)

我猜你的问题出现在if语句的else部分的第二个for循环中。即使您有匹配的日期,您也会有一些不匹配的日期。因此,您将金额设为i。

你应该添加:

System.out.println("The dates are equal. New amount is: " + amt);

到你的if语句并且:

System.out.println("Dates do not match. " + amt);

现在你应该看到你以正确的方式添加数量,但是你在else部分重置了好几次。