假设我有一个二维数组,例如String array[][] = {{"",""},{"",""}}
并且此数组打印出新行中的每一行。
现在,我的问题是,如果用户希望通过Scanner
输入添加一组新行来添加到此数组,我该怎么做呢?
例如,假设我有一个库存清单,我刚刚注意到一批新货到了。如何将此新库存添加到现有库存中。
我的想法是,如果我的阵列不够大,那么我将不得不制作一个新的,更大的阵列并将原始数据复制到那里。从这一点来说,我可以添加新数据。所以我认为一些for循环应该足够了。但我不知道如何在这里申请?
答案 0 :(得分:2)
由于Java数组不是动态大小的数据结构,我建议您使用Collection
(如List
)(表示动态大小的数据结构的接口类型)。像,
List<List<String>> al = new ArrayList<>();
al.add(Arrays.asList("1", "2"));
al.add(Arrays.asList("3", "4"));
String str = "5, 6"; // <-- let's assume the user wants to add a 5 and 6
al.add(Arrays.asList(str.split(",\\s*")));
System.out.println(al);
输出
[[1, 2], [3, 4], [5, 6]]
注意与数组不同,ArrayList
和LinkedList
都会覆盖toString()
。
答案 1 :(得分:1)
是的,您可以通过调用Arrays.copyOf
方法然后将其重新分配给初始对象来增加数组的大小。但无论如何如果你不想一次又一次地复制ArrayList
是一个更好的选择,因为它内部使用Arrays.copyOf
来增加数组的大小,因为它在内部执行时会调用add (E e)as:
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
ensureCapacityInternal(size + 1)
检查分配的默认容量的最大值,即10到大小+ 1:
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
如果调用容量超过ensureExplicitCapacity(minCapacity);
,则会通过调用内部transient Object[]
的{{1}}来增加grow()
的容量。
希望这个解释有所帮助。
对于您的问题,您可以执行以下操作:
Arrays.copyOf
答案 2 :(得分:0)
阵列是固定大小的。除非每次都创建一个新数组,否则无法更改大小。
正确的方法是使用ArrayList
。
List<String> shipments = new ArrayList<String>();
shipments.add("newShipments");
我发现你的记录中有一个属性。您可以创建Shipment类。 (如果记录中需要多个字符串或变量,则可以按如下方式创建对象的arraylist:)
示例:强>
class Shipment
{
//Place your attributes here..
String name;
String id;
//Constructors and methods not shown
}
List<Shipment> records = new ArrayList<Shipment>();
records.add(new Shipment("Dresses", "A-123"));
//Having an arraylist of objects allows you to hold more than 1 variable.
//Now each `records` can hold 2 String variables `name` and `id`.
答案 3 :(得分:0)
您无法扩展阵列 - 需要将其复制到新阵列。幸运的是,有一种方法可以让您轻松实现:Arrays.copyOf
。
所以:
String[] names = {"Bill", "Bob"};
names = Arrays.copyOf(names, names.length + 1);
names[names.length - 1] = "Mary";
答案 4 :(得分:0)
案例1:使用数组
假设
String array[][] = {{"oldinventory1","oldinventory2"},{"oldinventory3","oldinventory4"}};
并且您希望在2执行
时插入新广告资源array[2][2]="newinventory1";
由于数组中没有2索引,因此数组索引会超出绑定范围,因为数组行和列在第一个中是固定的。
案例2:使用列表
您可以使用List删除arraysize问题。通过在@Elliott Frisch的示例中声明List中的List,还有一个优势:
List<List<String>> al = new ArrayList<>();
al.add(Arrays.asList("oldinventory1", "oldinventory2"));
al.add(Arrays.asList("oldinventory3", "oldinventory4"));
String str = "newinventory5, newinventory6,, newinventory6";
即不仅我们可以动态增加行,而且我们可以添加新列。因此,如果您在3到5或1之间的任何时候增加库存,您就可以轻松处理。
答案 5 :(得分:0)
数组的大小是固定的,因此您需要将数组复制到更大的数组。您可以使用Arrays.copyOf()
制作副本。
这是使用带有多维数组的copyOf方法的一个示例。
String[][] array = {{"A", "B"},{"C", "D"}};
String[] newValuesArray = {"E", "F"};
array = Arrays.copyOf(array, array.length + 1);
array[array.length - 1] = newValuesArray;