繁体   English   中英

Java Arraylist 使用元素

[英]Java Arraylist working with elements

我有一个String[]ArrayList

每个String[]包含两个值:值和日期。

如果我打印它,它看起来像这样:

 value | date
-------|----------
 357.0 | 2011/05/30
-234.0 | 2011/05/31
-123.0 | 2011/05/30

我想制作一个新的ArrayList ,其中将同一日期的所有值相加。 像这样:

 value | date
-------|----------
 234.0 | 2011/05/30
-234.0 | 2011/05/31

任何人都可以帮忙吗?

您也正在遭受object 拒绝

String不是处理数字或日期的好类型。 对于一个数字,我会使用int (如果您只有 integer 值)、 doubleBigDecimal (如果它是货币数量或其他一些精确的十进制数)。

对于日期,我将使用来自Joda TimeDate / CalendarLocalDate (如果您可以使用外部库)。

显然,这意味着您不能再将数据存储在String[]中,但无论如何,这对于任何类型的结构化数据都不是真正合适的类型。

您想编写一个反映您的价值观的 class :

public class DatedValue {
  private final Date date;
  private final BigDecimal value;

  public DatedValue(final Date date, final BigDecimal value) {
    this.date = date;
    this.value = value;
  }

  public Date getDate() {
    return date;
  }

  public BigDecimal getValue() {
    return value;
  }
}

然后,您可以通过迭代原始ArrayList<DatedValue>来简单地创建新值:

Map<Date,DatedValue> result = new LinkedHashMap<Date,DatedValue>();
for(DatedValue dv : datedValues) {
  DatedValue newDV = result.get(dv.getDate());
  if (newDV == null) {
    newDV = dv;
  } else {
    newDV = new DatedValue(dv.getDate(), dv.getValue().add(newDV.getValue()));
  }
  result.put(dv.getDate(), newDV);
}
List<DatedValue> sums = new ArrayList<DatedValue>(result.values());

如果您更喜欢在 SQL 层执行此操作,您可以执行以下操作:

SELECT date, SUM(value)
FROM
    (SELECT date, value
    FROM positive_values_table
    UNION ALL
    SELECT date, value
    FROM negative_values_table)
GROUP BY date

并不是说你不能在 Java 中做到这一点,但这种聚合对于 SQL 来说是生计。

  • 使用Map<Date, Double> dateToValueMap

注意:您可以使用字符串作为键(字符串形式的日期),也可以使用SimpleDateFormat class 从String中获取Date

  • 遍历ArrayList
  • 检查Map中是否存在日期,更新条目,否则添加

您可以使用 HashMap 以日期为键!

一些简单的事情:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;

public class Sum {

    /**
     * @param args
     */

    private ArrayList < String[] > date;
    private HashMap < String, Double > date_hash;

    public Sum() {
        date = new ArrayList < String[] > ();
        date.add(new String[] {
            "357.0", "2011/05/30"
        });
        date.add(new String[] {
            "-234.0", "2011/05/31"
        });
        date.add(new String[] {
            "-123.0", "2011/05/30"
        });
    }


    public static void main(String[] args) {

        new Sum().sum();

    }

    public void sum() {
        date_hash = new HashMap < String, Double > ();
        for (int i = 0; i < date.size(); i++) {
            String[] array = date.get(i);
            String key = array[1];
            if (date_hash.containsKey(key)) {
                date_hash.put(key, Double.valueOf(array[0]) + Double.valueOf(date_hash.get(key)));
            } else {
                date_hash.put(key, Double.valueOf(array[0]));
            }
        }
        Set < Entry < String, Double >> set = date_hash.entrySet();
        Iterator < Entry < String, Double >> iterator = set.iterator();
        while (iterator.hasNext())
            System.out.println(iterator.next());
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM