过滤并拆分ArrayList

时间:2014-03-03 00:26:21

标签: java arraylist

在我的程序中,我有ArrayList of Events。以下是我的代码的摘录:

ArrayList<Event> events;

public class Event
{
    // with getter and setter - don't write it down to keeps this short
    protected int day, month, year;
}

public static void main(String args[])
{
    events = new ArrayList<Event>();
    // fill list with items

    HashMap<String, ArrayList<Event>> map = orderEvents(3, 2014);        
    // some more code
}

private HashMap<String, ArrayList<Event>> orderEvents(int month, int year)
{
    // should return all events from the given month and year in a HashMap
    // HashMap has this format: key = day | value = events of this day
}

当然,现在我可以遍历整个列表并使用大量的if conditions但是我认为我没有最有效的解决方案,对于其他人来说,它很难阅读。是否有一些方法可以过滤ArrayLists或用它们中的Object值分割它们?

1 个答案:

答案 0 :(得分:1)

这是我的解决方案

public static class ListExtractor<K, V> {

    List<V> list = new ArrayList<>();

    public ListExtractor(List<V> list) {
        this.list = list;
    }

    public Map<K, List<V>> extract(Extractor<K, V> extractor) {
        Map<K, List<V>> res = new HashMap<K, List<V>>();

        for (V v : list) {
            K key = extractor.getKey(v);
            if (!res.containsKey(key))
                res.put(key, new ArrayList<V>());
            res.get(key).add(v);
        }

        return res;
    }
}

public static interface Extractor<K, V> {
    public K getKey(V v);
}

以下是使用MyEvent

的示例
public static class MyEvent {

int day, month, year;

    public MyEvent(int day, int month, int year) {
        this.day = day;
        this.month = month;
        this.year = year;
    }

    @Override
    public String toString() {
        return day + "-" + month + "-" + year;
    }
}

public static void main(String[] args) {
    //Setup the list
    List<MyEvent> events = new ArrayList<MyEvent>();
    events.add(new MyEvent(02, 03, 2014));
    events.add(new MyEvent(02, 03, 2014));
    events.add(new MyEvent(02, 03, 2014));
    events.add(new MyEvent(01, 03, 2014));
    events.add(new MyEvent(01, 03, 2014));
    events.add(new MyEvent(28, 02, 2014));
    events.add(new MyEvent(28, 02, 2014));
    events.add(new MyEvent(27, 02, 2014));
    events.add(new MyEvent(26, 02, 2014));
    events.add(new MyEvent(26, 02, 2014));
    events.add(new MyEvent(26, 02, 2014));

            //Extract the lists
    Map<Integer, List<MyEvent>> extractedMap = new ListExtractor<Integer, MyEvent>(events).extract(new Extractor<Integer, MyEvent>() {
        @Override
        public Integer getKey(MyEvent v) {
            return v.day;
        }
    });

    StringBuilder sb = new StringBuilder();

    for (Entry<Integer, List<MyEvent>> entry : extractedMap.entrySet()) {
        sb.append("--> ");

        for (MyEvent event : entry.getValue()) {
            sb.append(event.toString());
            sb.append(", ");

        }
        sb.append("\n");
    }

    System.out.println(sb.toString());
}

这是输出

--> 1-3-2014, 1-3-2014, 
--> 2-3-2014, 2-3-2014, 2-3-2014, 
--> 26-2-2014, 26-2-2014, 26-2-2014, 
--> 27-2-2014, 
--> 28-2-2014, 28-2-2014,