有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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,但我认为我没有最有效的解决方案,对其他人来说,这将很难阅读。有没有一些方法可以用来过滤ArrayList,或者根据ArrayList中对象的值将其拆分


共 (1) 个答案

  1. # 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,