java中的动态数组声明

时间:2010-10-29 17:10:59

标签: java arrays

任何人都可以告诉我这个java声明中的错误String[][] t=new String[15][15];这个工作正常,如果我使用String[][] t=new String[][];因为我需要声明变量t是动态的,因为我不知道我有多少值要去商店。

7 个答案:

答案 0 :(得分:8)

使用ArrayList(或可以处理任意数量对象的其他数组对象)。 java数组总是有一个固定的长度,因为一些内存将保留给数组。

ArrayList也创建了这样的数组来存储对象。你添加更多的abjects作为数组的当前保留大小比ArrayList将创建一个新的更大的数组(如果我是正确的话,+ 50%)。还有一些其他实现有点不同(例如,当阵列已满时,它们会创建一个新阵列100%的原始阵列。如果性能对你来说非常重要,那么你可以看一下。

ArrayList<ArrayList<String> t = new ArrayList<ArrayList<String>();

void fill() {
    ArrayList<String> t2 = new ArrayList<String>();
    t2.add("somestring");
    String s = "someotherstring";
    t2.add(s);
    t.add(t2);
}

答案 1 :(得分:4)

如果您不知道需要多大才能将其声明为

String[][] t;

一旦你知道它需要有多大,你可以做(​​之前尝试使用数组)

t = new String[15][15];

如果你不确定数组需要多大,你需要使用像列表一样的东西。

List<List<String>> t = new ArrayList<List<String>>;

public void add(String str, int row, int col) {
    while (row >= t.size())
        t.add(new ArrayList<String>());

    List<String> row_list = t.get(row);
    while (col >= row_list.size())
        row_list.add("");

    row_list.set(col, str);
}

答案 2 :(得分:1)

在Java数组中,对象始终具有固定长度。一旦分配了它们,就无法改变它们的大小。可以使数组变量指向不同大小的不同数组对象。所以你可以分配:

String[][] t;

一旦知道大小,它就不会指向一个对象并分配一个对象:

int n1,n2;
// calculate n1,n2
t = new String[n1][n2];

如果你需要一个可以改变大小的结构,你最好使用可以动态调整大小的ArrayList。

答案 3 :(得分:1)

将其声明为String [][]t = null;

实际长度 重新初始化

t=new String[x][y];

答案 4 :(得分:0)

Vector也可以增长:

Vector<Vector<String>> t = new Vector<Vector<String>>();

然后调用Add方法将项添加到向量中。

答案 5 :(得分:0)

正如bemace所说,仅仅因为你声明变量并不意味着你必须立即初始化它。

正如Mark所说,阵列具有固定的大小。一旦数组初始化(未声明,初始化),它就有一个固定的大小。

所以,有两种可能性:

要么你需要知道在开始使用它之前需要多大的数组,在这种情况下你可以按照bemace的建议简单地延迟你的初始化。

或者在开始使用之前你不知道它需要多大,在这种情况下你需要使用动态大小的数据结构。查看Java Collections API:

tutorial api reference

答案 6 :(得分:0)

已经有几个好的答案,但现在已在Mark Baijens' answer的评论中透露,此问题的目的是raju需要键来进行多值映射。

马克通过建议raju使用HashMap<String, String> hashMap = new HashMap<String, String>();来跟进该评论 - 但这仅适用于单个键值对。

raju需要的是

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

为密钥添加第一个值需要为该存储桶初始化List,而添加其他值则需要获取现有列表并添加新值。

注意我在声明中使用了Collection<String>,因此如果值的顺序很重要,它可以是List,也可以是Set,以防止在同一个键下重复值。

这可能最好作为一个类本身实现,也许

public class MultiValueMap<K, V> extends Map<K, V>
{
    ...
}

因此,可以在实现中隐藏第一个put(key, value)和后续.add(value)列表的初始化。