2014-08-28 30 views
0

我有一个排序的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类相同日期的ArrayList值是 -

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

请给我一些提示完成它。提前致谢。

+0

什么意思是“下面的代码,但它不能正常工作。”任何异常或结果都不是预期的结果? – Jens 2014-08-28 07:45:09

+0

您需要扩展“不能正常工作”。什么*确切*无法正常工作?它目前在做什么,它应该做什么? – JonK 2014-08-28 07:45:11

+1

只是一个建议,只要你被代码困住,不工作,一步一步地进行。尝试调试代码或添加日志来找出问题。这将会磨练你的编程技能,相信我你自己会解决这个问题。 – underdog 2014-09-02 07:07:41

回答

3

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

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

现在你应该可以看到添加量的正确途径,但你重新设置在其他部分几倍。

1

在内部为,当您添加特定日期的值时,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++; 
} 
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