我对Java很新,并且在找到要执行以下操作的结构时遇到问题。
我想要一个固定长度的数组。每个项目都是一个包含字符串的可变长度数组(或列表)。所以我试过......
ArrayList<String>[] wordList = new ArrayList[maxWordLength];
我从Java那里得到了一个耳罩,#34; Main.java使用未经检查或不安全的操作。&#34;当我尝试添加一个项目时,我得到&#34; java.lang.NullPointerException&#34;
wordList[oneWord.length()-1].add(oneWord);
我应该如何创建我的结构以保持Java的快乐?
答案 0 :(得分:4)
Java不喜欢泛型类型的数组。 (请参阅Java教程中的Restrictions on Generics。)而是使用列表列表:
List<List<String>> wordList = new ArrayList<>(maxWordLength);
这会创建一个初始容量为maxWordLength
的列表,其中可以包含String
列表。初始大小(与容量相对)将为0.然后,您可以将单个字符串列表添加到wordList
。为了避免以后NullPointerException
,您应该使用空列表填充wordList
以开始:
for (int i = 0; i < maxWordLength; i++) {
wordList.add(new ArrayList<>());
}
最后,您可以使用以下内容在wordList
的特定列表中添加单词:
wordList.get(oneWord.length() - 1).add(oneWord);
这并不强制wordList
具有固定长度,但在其他方面应符合您的要求。
答案 1 :(得分:0)
保持简单: 包含所有元素的数组作为字符串的数组:
List<List<String>> listOfStringsArray = new ArrayList<>();
List<String> stringArray = Arrays.asList("String1", "String2");
listOfStringsArray.add(stringArray);
答案 2 :(得分:0)
List
是ArrayList
和LinkedList
等具体类必须实现的接口。
ArrayList
是一个List
,针对顺序读取和添加进行了优化,并由内部数组支持。
ArrayList<blah>
或List<blah>
是List
,其中包含继承blah
的对象(或者如果它是接口,则是实现它的对象。)
ArrayList[]
实际上是ArrayList
的数组new ArrayList[x]
,这实际上意味着创建一个包含ArrayList
s的x长度数组。每个ArrayList
都没有分配,所以它是一个未初始化的对象,默认情况下,它在许多编译器中都是null
,但你不能依赖它。
因此,假设您创建了包含可变长度列表的固定长度数组。您要么必须对数组进行循环并说出wordList[i] = new ArrayList<String>()
,要么在分配之前必须进行空检查,并在每次分配时创建新的ArrayList