任何人都可以告诉我这个java声明中的错误String[][] t=new String[15][15];
这个工作正常,如果我使用String[][] t=new String[][];
因为我需要声明变量t是动态的,因为我不知道我有多少值要去商店。
答案 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:
答案 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)
列表的初始化。