java中的动态数组声明
有人能告诉我这个java声明中的错误吗java中的动态数组声明,java,arrays,Java,Arrays,有人能告诉我这个java声明中的错误吗String[]t=newstring[15][15]这很好用,如果我使用String[]t=newstring[]因为我需要将变量t声明为动态变量,因为我不确定要在t中存储多少值。使用ArrayList(或其他可以处理任意数量对象的数组对象)。java数组总是有固定的长度,因为会为数组保留一些内存 ArrayList也创建这样的数组来存储对象。当然,添加更多的Abject作为数组的当前保留大小,而ArrayList将创建一个新的更大的数组(如果我正确的话,
String[]t=newstring[15][15]代码>这很好用,如果我使用String[]t=newstring[]代码>因为我需要将变量t声明为动态变量,因为我不确定要在t中存储多少值。使用ArrayList(或其他可以处理任意数量对象的数组对象)。java数组总是有固定的长度,因为会为数组保留一些内存
ArrayList也创建这样的数组来存储对象。当然,添加更多的Abject作为数组的当前保留大小,而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);
}
ArrayList如果您不知道它需要多大,只需将其声明为
String[][] t;
一旦你知道它需要有多大,你就可以做(在尝试使用阵列之前)
如果您不确定数组需要有多大,则需要使用类似列表列表的内容
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);
}
List t=newarraylist;
公共void add(字符串str、int行、int列){
而(行>=t.size())
t、 添加(新的ArrayList());
List row\u List=t.get(row);
while(col>=row_list.size())
行列表。添加(“”);
行列表集合(列、列);
}
在Java中,数组对象的长度总是固定的。一旦分配了它们,就不能更改它们的大小。数组变量可以指向不同大小的不同数组对象。因此,您可以分配:
String[][] t;
它不会指向一个对象,并在您知道其大小后分配一个对象:
int n1,n2;
// calculate n1,n2
t = new String[n1][n2];
如果您需要一个可以更改大小的结构,最好使用ArrayList,它可以动态调整大小。正如bemace所说,仅仅因为您要声明变量并不意味着您必须立即初始化它
正如Mark所说,数组有一个固定的大小。一旦数组被初始化(未声明,初始化),它就有一个固定的大小
因此,有两种可能性:
或者,在开始使用之前,您将知道阵列需要有多大,在这种情况下,您可以按照bemace的建议简单地延迟初始化
或者,在开始使用它之前,您不知道它需要有多大,在这种情况下,您需要使用动态大小的数据结构。请查看Java Collections API:
将其声明为字符串[][]t=null;
一旦你得到它,用实际长度重新初始化它
t=new String[x][y];
已经有好几个很好的答案,但现在在一篇评论中透露,这个问题的目的是raju需要一把多值映射的钥匙
Mark在评论之后建议raju使用一个HashMap HashMap=new HashMap();
——但是这只适用于单个键值对
raju需要的是一个
Map<String, Collection<String>> t
= new HashMap<String, List<String>>();
Map t
=新HashMap();
为键添加第一个值需要初始化该bucket的列表,而添加其他值需要获取现有列表并添加新值
注意:我在声明中使用了Collection
,因此如果值的顺序很重要,它可以是一个列表,也可以是一个集合,以防止在同一个键下重复值
这可能最好作为类本身来实现
public class MultiValueMap<K, V> extends Map<K, V>
{
...
}
公共类多值映射扩展了映射
{
...
}
因此,在第一次put(key,value)
和随后的.add(value)
列表中的列表初始化可以隐藏在实现中。Java数组总是有固定长度,而不是最大长度。一些条目可能为null。虽然这是可能的,但您需要创建一个ArrayList of(ArrayList of String),并且s=t[3][12];
变成s=t.get(3).get(12);
我可以在数组列表中添加多维吗???我有一个键和一个值,我将键和值存储在数组[0][0]中,[0][1]中的值,就像一个键有很多值一样…如果你有一个键和一个值,你可以使用HashMap,HashMap HashMap=newhashmap();
如果你打算使用数组作为键/值对,那么拜仁上面的答案在我看来效果最好。如果我使用String[]]t=null;
我在线程“main”java.lang.NullPointerException中遇到一个错误,在使用它时出现异常t[0][0]=“ana code>@raju:你仍然需要做t=newstring[sizeX][sizeY]
在您发现维度需要是什么之后,但在您的t[0][0]=
赋值之前。实现实际用例的最佳方法。
public class MultiValueMap<K, V> extends Map<K, V>
{
...
}