gpt4 book ai didi

java - 过滤和分割ArrayList

转载 作者:行者123 更新时间:2023-12-01 13:19:49 25 4
gpt4 key购买 nike

在我的程序中,我有一个事件数组列表。这是我的代码的摘录:

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

最佳答案

这是我的解决方案

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,

关于java - 过滤和分割ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22135628/

25 4 0