用值填充列表<List<String>>

Filling a List<List<String>> with values

所以我 运行 犯了一些错误。当我尝试将事件添加到一个月中的日期时,我尝试将事件添加到日期 ArrayList,但列表中没有可用的数字。所以我想知道如何实例化一个包含天数的列表。

我知道您可以使用

来实例化有多少个月
public static List<List<String>> events = new ArrayList<List<String>>(12);

其中 12 是月数,但是有没有办法让所有 12 个阵列都有 31 个插槽开放几天?

我觉得你应该改变你的设计方案。使用 ArrayLisy<String>(31) 创建一个 class 月,您在另一个 class 中创建 12 次,称为年或其他。对于我自己,我会这样做,它使您的代码更具可读性!

此外,当它是固定数量的插槽时(并且您不希望它超过该限制),请使用基本数组

我建议您彻底改变您的设计。

  • 根据事件列表使用日期映射 - 处理同一日期的多个事件
  • 延迟初始化地图。创建一个 returns 列出给定 day/month 的方法,如果不存在,请添加它。

代码

private class Events {
    Map<Date, List<String>> events = new HashMap<Date, List<String>>();
    public List<String> getEvents(int month, int day) {
        Calendar calendar = GregorianCalendar.getInstance();
        calendar.set(0, month, date, 0, 0, 0);
        Date date = calendar.getTime();
        List<String> list = events.get(date);
        if (list == null) {
            list = new ArrayList<String>();
            events.put(date, list);
        }
        return list;
    }
}

用法

Events events = new Events();
events.getEvents(11, 25).add("Christmas");
events.getEvents(0, 1).add("New years day");

为什么不用

List<Map<String, Integer>> = new List<HashMap<String, Integer>>();

虽然@Adam 的回答可能是处理这个特定问题的最佳方法,但还应解决如何初始化多维列表结构的一般问题。

构建和初始化像您描述的那样的多维数据结构的标准习惯用法是使用一组 for 循环,如下所示:

int[][] myArray = new int[][myFirstDimension];
for(int i=0; i<a.length; i++){
    int [] a = new int[mySecondDimension];
    for(int j=0; j<b.length; j++){
        a[j] = myInitialValue;
    }
    myArray[i] = a;
}

嵌套 ArrayList 的构造方式与数组类似,但有一个重要区别:传递给 ArrayList 的参数只是初始容量,而不是初始大小。事实上,ArrayList 实际上 不保证 它分配了多少 space,尽管在实践中,IIRC,它通常分配 2 的下一个幂。在初始化其内容之前尝试索引到 ArrayList 将抛出 IndexOutOfBoundsException.

因此,在初始化嵌套的 ArrayList 时,我们通常会这样做:

List<List<String>> myList = new ArrayList<>();
for(int i=0; i<myFirstDimension; i++){
    List<String> a = new ArrayList<>();
    for(int i=0; i<mySecondDimension; i++){
        a.add(""); // or `null`, if that is needed
    }
   myList.add(a);
}