Java Arraylist работает с элементами - PullRequest
1 голос
/ 30 мая 2011

У меня есть ArrayList из String[].

Каждый 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

Может кто-нибудь помочь?

Ответы [ 4 ]

8 голосов
/ 30 мая 2011

Вы тоже страдаете от отрицания объекта .

String не подходит для обработки чисел или дат. Для числа я бы использовал int (если у вас есть только целочисленные значения), double или BigDecimal (если это денежная сумма или другое точное десятичное число).

В качестве даты я бы использовал Date / Calendar или LocalDate из Время Joda (если вы можете использовать внешнюю библиотеку).

Очевидно, это означает, что вы больше не можете хранить свои данные в String[], но, в любом случае, это не совсем подходящий тип для структурированных данных любого типа.

Вы хотели бы написать класс, отражающий ваши значения:

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());
2 голосов
/ 30 мая 2011

Если вы предпочитаете делать это на уровне 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.

1 голос
/ 30 мая 2011

Вы можете использовать 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());
    }

}
1 голос
/ 30 мая 2011
  • используйте Map<Date, Double> dateToValueMap

Примечание. Вы можете либо использовать String в качестве ключа (Date в форме String), либо использовать класс SimpleDateFormat для получения Date из String

  • Итерация по ArrayList
  • Проверьте, существует ли Дата на карте, обновите запись, добавьте иначе
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...