我想创建一个如下所示的数组列表:

ArrayList<Individual>[] group = new ArrayList<Individual>()[4];

但它不是编译。我该怎么做呢?


当前回答

如此:

ArrayList<String>[] group = new ArrayList[4];

尽管它会产生一个你可能想要抑制的警告。

其他回答

如果你想避免Java警告,并且仍然有一个数组列表数组,你可以将数组列表抽象为一个类,就像这样:

public class Individuals {
    private ArrayList<Individual> individuals;
    
    public Individuals() {
        this.individuals = new ArrayList<>();
    }
    
    public ArrayList<Individual> getIndividuals() {
        return individuals;
    }
}

那么你就可以安全地拥有:

Individuals[] group = new Individuals[4];

这种情况的问题是,通过使用数组列表,在特定位置进行加法,你会得到o(n)的时间复杂度。如果使用数组,则通过声明数组来创建内存位置,因此它是常量

可以创建Array或ArrayList

List<Integer>[] outer = new List[number];
for (int i = 0; i < number; i++) {
    outer[i] = new ArrayList<>();
}

这在这种情况下很有帮助。你知道外面那个的尺寸。但是内部的大小是不同的。在这里,您可以创建一个固定长度的数组,其中包含大小变化的数组列表。希望这对你有所帮助。

在Java 8及以上版本中,你可以以一种更好的方式做到这一点。

List<Integer>[] outer = new List[number];
Arrays.setAll(outer, element -> new ArrayList<>());

根据Oracle文档:

不能创建参数化类型的数组

相反,你可以这样做:

ArrayList<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>(4);

正如Tom Hawting - tackline所建议的那样,更好的做法是:

List<List<Individual>> group = new ArrayList<List<Individual>>(4);
ArrayList<String> al[] = new ArrayList[n+1];
for(int i = 0;i<n;i++){
   al[i] = new ArrayList<String>();
}