如何在 Java 中的 ArrayList 中存储大量数组?
How can I store a lot of arrays in an ArrayList in Java?
我有一个函数可以通过递归打印输入数组的每个数字组合。
public class comb {
public static void main(String[] args)
List<int[]> list = new ArrayList<int[]>();
int[] test = {1,2,3,4};
combinations(test,2,0,new int[2]);
listToString(list);
}
static void combinations(int[] arr, int n, int pos, int[] result){
if(n == 0){
System.out.println(Arrays.toString(result));
return;
}
for(int i = pos; i <= arr.length - n; i++){
result[result.length - n] = arr[i];
combinations(arr,n-1,pos+1,result);
}
}
产出
[1, 2]
[1, 3]
[1, 4]
[2, 2]
[2, 3]
[2, 4]
[3, 2]
[3, 3]
[3, 4]
如果我不想打印每个数组,而是想将它添加到列表中,我该怎么办?我不能只将结果添加到列表中,因为它在不断变化。
您可以复制数组,并将副本添加到列表中。
static void combinations(int[] arr, int n, int pos, int[] result, List<int[]> allResults){
if(n == 0){
allResults.add(Arrays.copyOf(result));
return;
}
// etc...
您可以通过多种方式实现它...
你可以...
使List<int[]> list = new ArrayList<int[]>();
成为static
全球
public class comb {
static List<int[]> list = new ArrayList<int[]>();
public static void main(String[] args) {
然后您可以将值添加到 ArrayList
...
static void combinations(int[] arr, int n, int pos, int[] result) {
if (n == 0) {
list.add(result);
return;
}
但这通常是个坏主意,是草率的编程并会导致不良习惯
你可以...
将 List
的引用传递给 combinations
方法...
static void combinations(int[] arr, int n, int pos, int[] result, List<int[]> list) {
if (n == 0) {
list.add(Arrays.copyOf(result, result.length));
return;
}
这样更好,因为它使 API 可重复使用,并且能够在程序的同一实例中多次调用,而不会破坏 List
中的内容,例如前面的例子
你可以...
有combinations
方法return一个List
...
static List<int[]> combinations(int[] arr, int n, int pos, int[] result) {
List<int[]> list = new ArrayList<>(25);
if (n == 0) {
list.add(Arrays.copyOf(result, result.length));
} else {
for (int i = pos; i <= arr.length - n; i++) {
result[result.length - n] = arr[i];
list.addAll(combinations(arr, n - 1, pos + 1, result));
}
}
return list;
}
这很酷,因为您不需要关心 List
是如何创建的,只需要关心 return arr
的所有组合根据您的规格。它可能不如前面的示例有效,因为您在每次递归时都创建了一个新的 List
,但确实隐藏了实现细节
我有一个函数可以通过递归打印输入数组的每个数字组合。
public class comb {
public static void main(String[] args)
List<int[]> list = new ArrayList<int[]>();
int[] test = {1,2,3,4};
combinations(test,2,0,new int[2]);
listToString(list);
}
static void combinations(int[] arr, int n, int pos, int[] result){
if(n == 0){
System.out.println(Arrays.toString(result));
return;
}
for(int i = pos; i <= arr.length - n; i++){
result[result.length - n] = arr[i];
combinations(arr,n-1,pos+1,result);
}
}
产出
[1, 2]
[1, 3]
[1, 4]
[2, 2]
[2, 3]
[2, 4]
[3, 2]
[3, 3]
[3, 4]
如果我不想打印每个数组,而是想将它添加到列表中,我该怎么办?我不能只将结果添加到列表中,因为它在不断变化。
您可以复制数组,并将副本添加到列表中。
static void combinations(int[] arr, int n, int pos, int[] result, List<int[]> allResults){
if(n == 0){
allResults.add(Arrays.copyOf(result));
return;
}
// etc...
您可以通过多种方式实现它...
你可以...
使List<int[]> list = new ArrayList<int[]>();
成为static
全球
public class comb {
static List<int[]> list = new ArrayList<int[]>();
public static void main(String[] args) {
然后您可以将值添加到 ArrayList
...
static void combinations(int[] arr, int n, int pos, int[] result) {
if (n == 0) {
list.add(result);
return;
}
但这通常是个坏主意,是草率的编程并会导致不良习惯
你可以...
将 List
的引用传递给 combinations
方法...
static void combinations(int[] arr, int n, int pos, int[] result, List<int[]> list) {
if (n == 0) {
list.add(Arrays.copyOf(result, result.length));
return;
}
这样更好,因为它使 API 可重复使用,并且能够在程序的同一实例中多次调用,而不会破坏 List
中的内容,例如前面的例子
你可以...
有combinations
方法return一个List
...
static List<int[]> combinations(int[] arr, int n, int pos, int[] result) {
List<int[]> list = new ArrayList<>(25);
if (n == 0) {
list.add(Arrays.copyOf(result, result.length));
} else {
for (int i = pos; i <= arr.length - n; i++) {
result[result.length - n] = arr[i];
list.addAll(combinations(arr, n - 1, pos + 1, result));
}
}
return list;
}
这很酷,因为您不需要关心 List
是如何创建的,只需要关心 return arr
的所有组合根据您的规格。它可能不如前面的示例有效,因为您在每次递归时都创建了一个新的 List
,但确实隐藏了实现细节