gpt4 book ai didi

java - 按所包含对象的属性拆分 Java ArrayList

转载 作者:行者123 更新时间:2023-12-02 07:37:39 26 4
gpt4 key购买 nike

我有一个ArrayList,其中包含具有日期值的对象。现在,我想设法为每年创建一个新的 ArrayList,其中包含主 ArrayList 中日期值具有相同年份的所有对象。

因此 2010 年的所有对象都放在一个列表中,1999 年的所有对象都放在另一个列表中。

最佳答案

您需要一个 Map<Year,List<DatedObject>> ,甚至可能 SortedMap 就像 TreeMap .

您还可以使用multimap from Guava .

本质上,您从每年映射(也许只是一个 Integer ), List<DatedObject>属于那一年。

由于年份有自然的排序顺序,您可能想看看是否 SortedMap为您提供您需要的功能。答案很可能是肯定的。

<小时/>

map 示例

这是一个 Java 代码片段,向您展示如何填充 map 。另请注意 NavigableMap 使用而不是 SortedMap ; NavigableMap允许包含范围查询(请参阅相关问题)。

    class DatedObject {
final String name; final int year;
DatedObject(String name, int year) {
this.name = name; this.year = year;
}
@Override public String toString() {
return String.format("%s (%d)", name, year);
}
}
List<DatedObject> masterList = Arrays.asList(
new DatedObject("A", 2010),
new DatedObject("B", 2009),
new DatedObject("C", 2006),
new DatedObject("D", 2010),
new DatedObject("E", 2009),
new DatedObject("F", 2011)
);
NavigableMap<Integer,List<DatedObject>> objectsByYear =
new TreeMap<Integer,List<DatedObject>>();
for (DatedObject obj : masterList) {
List<DatedObject> yearList = objectsByYear.get(obj.year);
if (yearList == null) {
objectsByYear.put(obj.year, yearList = new ArrayList<DatedObject>());
}
yearList.add(obj);
}
System.out.println(objectsByYear);
// prints "{2006=[C (2006)], 2009=[B (2009), E (2009)],
// 2010=[A (2010), D (2010)], 2011=[F (2011)]}"
System.out.println(objectsByYear.get(2011));
// prints "[F (2011)]"
System.out.println(objectsByYear.subMap(2007, true, 2010, true));
// prints "{2009=[B (2009), E (2009)], 2010=[A (2010), D (2010)]}"

相关问题

<小时/>

分区列表

如果您绝对坚持 List<List<DatedObject>> partitionedList ,然后按照上面的方法构建 map ,然后简单地遵循:

List<List<DatedObject>> partitionedList =
new ArrayList<List<DatedObject>>(objectsByYear.values());
System.out.println(partitionedList);
// prints "[[C (2006)], [B (2009), E (2009)], [A (2010), D (2010)], [F (2011)]]"
<小时/>

多图示例

您还可以使用Multimap来自 Guava ,和 Multimaps.index 使用方法如下:

    Multimap<Integer,DatedObject> mmap = Multimaps.index(
masterList,
new Function<DatedObject, Integer>(){
@Override public Integer apply(DatedObject from) {
return from.year;
}
}
);
System.out.println(mmap);
// prints "{2010=[A (2010), D (2010)], 2009=[B (2009), E (2009)],
// 2006=[C (2006)], 2011=[F (2011)]}"

API 链接

关于java - 按所包含对象的属性拆分 Java ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2921003/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com