填写清单<list <string>&gt;值为</list <string>

时间:2015-03-07 21:41:00

标签: java arraylist instantiation

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

我知道您可以使用

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

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

4 个答案:

答案 0 :(得分:2)

我建议您完全改变您的设计。

  • 在事件列表中使用日期地图 - 处理同一日期的多个事件
  • 懒惰初始化地图。创建一个返回给定日/月列表的方法,如果不是,则添加它。

代码

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");

答案 1 :(得分:1)

我认为你应该改变你的设计方案。创建一个带有ArrayLisy<String>(31)的类,在另一个名为year或者其他类的类中创建12次。对于我自己,我会这样做,它使你的代码更具可读性!

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

答案 2 :(得分:0)

为什么不使用

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

答案 3 :(得分:0)

虽然@ 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实际上使无保证关于它分配了多少空间,尽管在实践中,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);
}