2011-05-30 121 views
1

我有一個ArrayListString[]Java 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 

任何人都可以幫忙嗎?

+2

你有什麼迄今所做?任何您需要幫助的具體問題? – Jacob 2011-05-30 07:32:25

+0

沒有太多......實際上這個數據來自sqlite數據庫。正值是在一個表中,負值是來自其他表。也許這可能與SQL查詢,但我不明白sql那麼多,用arraylist它會更容易做? – Wish 2011-05-30 07:38:54

+0

真的,在SQL中執行它。請。 – Waldheinz 2011-05-30 08:36:14

回答

8

你也是,患有object denial

String不是處理數字或日期的好類型。對於一個數字,我會使用int(如果您只有整數值),doubleBigDecimal(如果它是貨幣金額或其他確切的十進制數)。

對於日期,我會使用Date/CalendarLocalDateJoda Time(如果您可以使用外部庫)。

顯然這意味着您不能再將數據存儲在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()); 
+1

+1對象拒絕 – 2011-05-30 07:47:38

+0

@Sean:我承認:我正在努力爭取成爲公認的術語;-)當我可以鏈接到第三方來源而不是我自己的答案時,那麼我會有韓元。 – 2011-05-30 08:26:56

1
  • 使用Map<Date, Double> dateToValueMap

注意:您可以使用String作爲鍵(字符串形式日期),或者你可以使用SimpleDateFormat類從String

    得到 Date
  • 迭代通過ArrayList
  • 檢查日期是否存在於地圖中,更新條目,否則添加
2

如果你更喜歡在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

你可以使用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()); 
    } 

}