我有一个像 -
这样的排序ArrayListList<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));
}
请给我一些提示来完成它。在此先感谢。
答案 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部分重置了好几次。