如何在Java中创建动态二维数组,以及如何获取和设置其元素并遍历所有元素?
我看到了帖子this。但是在帖子中,其中一个维度(行数)是已知的并且是固定的,但在我的情况下,两者都是可变的。
答案 0 :(得分:1)
这是不可能的,数组的长度总是静态的。
尝试使用列表列表。
LinkedList<LinkedList<String>> list = new LinkedList<LinkedList<String>>();
list.add(new LinkedList<String>()); // [[]]
list.get(0).add("hello"); // [["hello"]]
list.get(0).add("world"); // [["hello", "world"]]
list.add(new LinkedList<String>()); // [["hello", "world"], []]
list.get(1).add("bonjour"); // [["hello", "world"], ["bonjour"]]
该列表可以使用任何类而不是String。
要遍历列表,您需要执行以下操作:
for(LinkedList<String> subList : list){
for(String str : subList){
...
}
}
答案 1 :(得分:0)
您希望使用List或ArrayList,它允许具有不同数据类型的二维数组,您可以根据需要添加/删除行。
答案 2 :(得分:0)
尝试使用类似的东西。
ArrayList<ArrayList<String>> listOfLists = new ArrayList<ArrayList<String>>();
ArrayList<String> tempList = new ArrayList<String>();
tempList.add("one");
tempList.add("two");
listOfLists.add(tempList);
任何具有类似功能的数据结构都可以。
答案 3 :(得分:0)
与其他人一样,我们不能在Java中拥有动态长度的数组。要解决这个问题,您可以使用java.util.ArrayList
之类的内容。我们可以继续向ArrayList
添加实体,而无需给出该列表的最终大小。
像ArrayList
这样的类能够做到这一点,因为他们不断创建新的数组来存储数据。 ArrayList<String>
最初将创建一个大小为10的String[]
数组(这是一个示例大小),但是当您向ArrayList添加第11个元素时,它将创建一个新的String []大小为20(再次,这是一个示例大小)并将旧数组的内容复制到新数组中。
为了快速创建新阵列,它使用此方法:System.arrayCopy(Object src, int srcPos, Object dest, int destPos, int length)
所以你在技术上可以做同样的事情。每当你需要一个更大尺寸的数组时:
答案 4 :(得分:0)
以下是字符串二维ArrayList的示例:
import java.util.ArrayList;
public class Matrix {
ArrayList<ArrayList<String>> matrix;
Matrix () {
matrix = new ArrayList<>();
}
void set(int i, int j, String value) {
while (matrix.size() <= i) {
matrix.add(new ArrayList<String>());
}
while (matrix.get(i).size() <= j) {
matrix.get(i).add("");
}
matrix.get(i).set(j, value);
}
String get(int i, int j) {
try {
return matrix.get(i).get(j);
} catch (IndexOutOfBoundsException e) {
return "";
}
}
ArrayList<ArrayList<String>> getMatrix() {
return matrix;
}
}
以下是填充数组并完成元素的方法:
Matrix matrix;
matrix = new Matrix();
matrix.set(3, 5, "You");
matrix.set(0, 0, "Hi");
for (ArrayList<String> list : matrix.getMatrix()) {
for (String value : list) {
System.out.print(value + "\t");
}
System.out.println();
}
答案 5 :(得分:0)
我个人会使用ArrayList
或LinkedList
,但如果您坚持使用array
,那么您可以检查的是n x m
大小的数组是否已满在分配值之前。如果它已满,则创建一个大小为(n+1) x (m+1)
的新多维数组,并使用循环复制所有值。
这种方法不是首选,因为它需要使用更多资源,因为每次填满数组时都需要重新创建和复制数组。