Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Java > ArrayList grouping?

Reply
Thread Tools

ArrayList grouping?

 
 
news.t-com.hr
Guest
Posts: n/a
 
      05-21-2009
How can I group values in ArrayList

Let's say I have List<Example> list = new ArrayList<Example>();

and Example is

public class Example{

private Date date;
private Integer no;
private Integer salary;
}

and I have initial data

01.01.2009 , 1 , 10000
02.01.2009, 1, 20000
01.01.2009, 2, 30000

and I want to transform this to two new lists so I can have in the first
arrayList grouped values by distinct date, and third row summed;

01.01.2009, 40000
02.01.2009, 20000

and second list distinct date+no and third row summed;

01.01.2009 , 1, 10000
01.01.2009, 2, 30000
02.01.2009, 1 , 20000

How can i do this transformation ?

Thanks in advance.




__________ Information from ESET NOD32 Antivirus, version of virus signature database 4092 (20090520) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com




 
Reply With Quote
 
 
 
 
John B. Matthews
Guest
Posts: n/a
 
      05-21-2009
In article <gv36ca$abr$>,
"news.t-com.hr" <> wrote:

> How can I group values in ArrayList
>
> Let's say I have List<Example> list = new ArrayList<Example>();
>
> and Example is
>
> public class Example{
>
> private Date date;
> private Integer no;
> private Integer salary;
> }
>
> and I have initial data
>
> 01.01.2009 , 1 , 10000
> 02.01.2009, 1, 20000
> 01.01.2009, 2, 30000
>
> and I want to transform this to two new lists so I can have in the first
> arrayList grouped values by distinct date, and third row summed;
>
> 01.01.2009, 40000
> 02.01.2009, 20000
>
> and second list distinct date+no and third row summed;
>
> 01.01.2009 , 1, 10000
> 01.01.2009, 2, 30000
> 02.01.2009, 1 , 20000
>
> How can i do this transformation ?


Well, you can loop through the list and create whatever cross-tabulation
you want: for (Example e : list) { ... }. In the first case, a HashMap
can be used to group records by date; in the second, Collections.sort()
with a suitable Comparator can handle the sorting. As Date implements
Comparable, the required Comparator is particularly straightforward.

Personally, I'd set up and query a relational database:

<http://java.sun.com/docs/books/tutorial/jdbc/basics/index.html>

--
John B. Matthews
trashgod at gmail dot com
<http://sites.google.com/site/drjohnbmatthews>
 
Reply With Quote
 
 
 
 
news.t-com.hr
Guest
Posts: n/a
 
      05-22-2009
thanks, i'll try that

"Piotr Kobzda" <> wrote in message
news:gv3mgu$bhk$...
> news.t-com.hr wrote:
>
> [...]
>> How can i do this transformation ?

>
> There are many solutions to your problem possible.
>
> One, a kind of general solution, may be using the following simple
> utility:
>
>
> import java.util.HashMap;
> import java.util.Map;
> import java.util.Map.Entry;
>
> /**
> * @param <E> the type of elements being grouped
> * @param <K> the type of grouping key
> * @param <V> the type of value associated with each group
> */
> public abstract class Grouper<E, K, V>
> {
> private static class ValueHolder<V>
> {
> V value;
>
> ValueHolder(V value)
> {
> this.value = value;
> }
> }
>
> private Map<K, ValueHolder<V>> map = new HashMap<K, ValueHolder<V>>();
>
> protected abstract K keyOf(E e);
> protected abstract V createValue(E e, K key);
> protected abstract V updateValue(E e, K key, V value);
>
> public void add(E e)
> {
> K key = keyOf(e);
> ValueHolder<V> valueHolder = map.get(key);
> if (valueHolder == null)
> {
> valueHolder = new ValueHolder<V>(createValue(e, key));
> map.put(key, valueHolder);
> }
> else
> {
> valueHolder.value = updateValue(e, key, valueHolder.value);
> }
> }
>
> public Map<K, V> toMap()
> {
> Map<K, V> res = new HashMap<K, V>();
> for (Entry<K, ValueHolder<V>> e : map.entrySet())
> {
> res.put(e.getKey(), e.getValue().value);
> }
> return res;
> }
>
> }
>
>
> The implementation provided may be redesigned and/or improved depending on
> needs (especially implementing Iterable<Entry<K, V>> to allow direct
> iteration of the inner map might be useful). But the idea presented seems
> to be flexible enough in many typical grouping scenarios.
>
>
> Below is an example based on your initial posting demonstrating intended
> use of my simple utility:
>
>
> import java.text.DateFormat;
> import java.text.ParseException;
> import java.text.SimpleDateFormat;
> import java.util.ArrayList;
> import java.util.Arrays;
> import java.util.Date;
> import java.util.List;
> import java.util.Map.Entry;
>
> public class GrouperDemo
> {
>
> static class Example
> {
> Date date;
> Integer no;
> Integer salary;
>
> static final DateFormat dateFmt = new SimpleDateFormat("d.M.y");
>
> Example(String date, Integer no, Integer salary)
> throws ParseException
> {
> this(dateFmt.parse(date), no, salary);
> }
>
> Example(Date date, Integer no, Integer salary)
> {
> this.date = date;
> this.no = no;
> this.salary = salary;
> }
>
> @Override
> public String toString()
> {
> return String.format("[%tF, %s, %s]", date, no, salary);
> }
> }
>
>
> static class DateNo
> {
> Date date;
> Integer no;
>
> DateNo(Date date, Integer no)
> {
> this.date = date;
> this.no = no;
> }
>
> @Override
> public boolean equals(Object obj)
> {
> return obj instanceof DateNo && equals((DateNo) obj);
> }
>
> public boolean equals(DateNo other)
> {
> return date.equals(other.date) && no.equals(other.no);
> }
>
> @Override
> public int hashCode()
> {
> return date.hashCode() ^ no.hashCode();
> }
>
> @Override
> public String toString()
> {
> return String.format("[%tF, %s]", date, no);
> }
> }
>
>
> public static void main(String[] args) throws Exception
> {
> List<Example> list
> = Arrays.asList(
> new Example("01.01.2009", 1, 10000),
> new Example("02.01.2009", 1, 20000),
> new Example("01.01.2009", 2, 30000));
>
> System.out.println(list);
>
>
> Grouper<Example, Date, Integer> gruper1
> = new Grouper<Example, Date, Integer>()
> {
>
> @Override
> protected Date keyOf(Example e)
> {
> return e.date;
> }
>
> @Override
> protected Integer createValue(Example e, Date key)
> {
> return e.salary;
> }
>
> @Override
> protected Integer updateValue(Example e, Date key, Integer value)
> {
> return value + e.salary;
> }
>
> };
>
>
> Grouper<Example, DateNo, Integer> gruper2
> = new Grouper<Example, DateNo, Integer>()
> {
>
> @Override
> protected DateNo keyOf(Example e)
> {
> return new DateNo(e.date, e.no);
> }
>
> @Override
> protected Integer createValue(Example e, DateNo key)
> {
> return e.salary;
> }
>
> @Override
> protected Integer updateValue(Example e, DateNo key,
> Integer value)
> {
> return value + e.salary;
> }
>
> };
>
> for (Example e : list)
> {
> gruper1.add(e);
> gruper2.add(e);
> }
>
> List<DateNo> res1 = new ArrayList<DateNo>();
> for (Entry<Date, Integer> e : gruper1.toMap().entrySet())
> {
> res1.add(new DateNo(e.getKey(), e.getValue()));
> }
>
> List<Example> res2 = new ArrayList<Example>();
> for (Entry<DateNo, Integer> e : gruper2.toMap().entrySet())
> {
> res2.add(
> new Example(e.getKey().date, e.getKey().no, e.getValue()));
> }
>
>
> System.out.println(res1);
> System.out.println(res2);
> }
> }
>
>
> piotr
>
> __________ Information from ESET NOD32 Antivirus, version of virus
> signature database 4095 (20090521) __________
>
> The message was checked by ESET NOD32 Antivirus.
>
> http://www.eset.com
>
>
>




__________ Information from ESET NOD32 Antivirus, version of virus signature database 4096 (20090522) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com




 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Clear Arraylist vs new ArrayList Philipp Java 6 05-28-2008 09:07 PM
Does the clone() method of ArrayList<> make a copy of the objects in the ArrayList? xz Java 16 08-04-2007 10:33 PM
a class inherited from ArrayList, is saved to ViewState, why the type of the object read from ViewSate is not the class, but the parent, ArrayList leal ting ASP .Net 1 02-10-2004 07:45 PM
writeObject with ArrayList of ArrayList? Kaidi Java 4 01-03-2004 08:16 PM
Iterate through ArrayList using an another ArrayList Saravanan Rathinavelu ASP .Net 3 08-19-2003 07:03 AM



Advertisments