java 中的动态数组合并
Dynamic array merge in java
我有两个这样的数组。
String[] arr1 = { "1", "2", "3" };
String[] arr2 = { "111", "222", "333", "444", "555", "666", "777", "888", "999" };
我想使用索引值的组合来合并这两个数组。
我的输入将是两个整数值(2:3 比例),像这样
int firstArray = 2; //input value
int secondArray = 4; //input value
合并后所有值将存储在单个列表中。现在我需要这样的输出。
1
2
111
222
333
444
3
1
555
666
777
888
2
3
999
111
222
333
循环应该运行直到哪个数组长度很大,并从两个数组中检索所有值。
如果数组长度改变了,那么输出比率也应该改变
String[] arr1 = { "1", "2", "3", "4", "5", "6", "7", "8" };
String[] arr2 = { "111", "222", "333", "444", "555" };
int firstArray = 3; //input value
int secondArray = 2; //input value
输出:
1
2
3
111
222
4
5
6
333
444
7
8
1
555
111
所以条件是输出应该包含两个数组的所有值,直到数组的最大长度,输出应该以第二个比率(第二个输入值 - secondArray)完成。
提前致谢。
String[] arr = mergeArrays(arr1, arr2, 2, 3);
System.out.println("Ratio 2:3");
for (String str : arr) {
System.out.println(str);
}
private static String[] mergeArrays(String[] arr1, String[] arr2, int firstArray, int secondArray) {
final String[] ret = new String[arr1.length + arr2.length];
for (int j = 0, k = 0; j < arr1.length || k < arr2.length;) {
if (j < arr1.length) {
do {
ret[j + k] = arr1[j];
j++;
} while (j < arr1.length && (j % firstArray != 0 || k == arr2.length));
}
if (k < arr2.length) {
do {
ret[j + k] = arr2[k];
k++;
} while (k < arr2.length && (k % secondArray != 0 || j == arr1.length));
}
}
return ret;
}
我试过了
但我无法正确输出
这应该有效:
public static void main(String args[]) throws IOException {
int[] array1 = {1, 2, 3, 4, 5, 6, 7, 8};
int[] array2 = {11, 22, 33};
int firstArray = 3;
int secondArray = 5;
for (int a1 = 0, a2 = 0; ;) {
for (int i = 0; i < firstArray; i++)
System.out.println(array1[a1++ % array1.length]);
if (a1 >= array1.length && a2 >= array2.length)
break;
for (int i = 0; i < secondArray; i++)
System.out.println(array2[a2++ % array2.length]);
if (a1 >= array1.length && a2 >= array2.length)
break;
}
}
如果您想在视频上生成一个新数组而不是打印结果,只需声明一个 ArrayList
并使用 add()
方法向其添加元素:
public static void main(String args[]) throws IOException {
int[] array1 = {1, 2, 3, 4, 5, 6, 7, 8};
int[] array2 = {11, 22, 33};
int firstArray = 3;
int secondArray = 5;
ArrayList<Integer> output = new ArrayList();
for (int a1 = 0, a2 = 0; ;) {
for (int i = 0; i < firstArray; i++)
output.add(array1[a1++ % array1.length]);
if (a1 >= array1.length && a2 >= array2.length)
break;
for (int i = 0; i < secondArray; i++)
output.add(array2[a2++ % array2.length]);
if (a1 >= array1.length && a2 >= array2.length)
break;
}
for (int i = 0; i < output.size(); i++)
System.out.println(output.get(i));
}
如果要创建函数:
public ArrayList<Integer> merge(int[] array1, int[] array2, int firstArray, int secondArray) {
ArrayList<Integer> output = new ArrayList();
for (int a1 = 0, a2 = 0; ;) {
for (int i = 0; i < firstArray; i++)
output.add(array1[a1++ % array1.length]);
if (a1 >= array1.length && a2 >= array2.length)
break;
for (int i = 0; i < secondArray; i++)
output.add(array2[a2++ % array2.length]);
if (a1 >= array1.length && a2 >= array2.length)
break;
}
return output;
}
如果您不想 return ArrayList
,只需将其转换为 int[]
我使用 List
而不是数组,因为我认为您无法真正预测结果数组的长度。
public static <T> List<T> merge(List<T> l1, List<T> l2, int r1, int r2) {
List<T> result = new ArrayList<T>();
int index1 = 0;
int index2 = 0;
while (index1 < l1.size() || index2 < l2.size()) {
for (int i = 0; i < r1; ++i)
result.add(l1.get((index1 + i) % l1.size()));
index1 += r1;
if (index2 < l2.size()) {
for (int i = 0; i < r2; ++i)
result.add(l2.get((index2 + i) % l2.size()));
index2 += r2;
}
}
return result;
}
测试代码:
String[] arr1 = { "1", "2", "3" };
String[] arr2 = { "111", "222", "333", "444", "555", "666", "777",
"888", "999" };
System.out.println(merge(Arrays.asList(arr1), Arrays.asList(arr2), 2, 4));
输出:
[1, 2, 111, 222, 333, 444, 3, 1, 555, 666, 777, 888, 2, 3, 999, 111, 222, 333]
我有两个这样的数组。
String[] arr1 = { "1", "2", "3" };
String[] arr2 = { "111", "222", "333", "444", "555", "666", "777", "888", "999" };
我想使用索引值的组合来合并这两个数组。
我的输入将是两个整数值(2:3 比例),像这样
int firstArray = 2; //input value
int secondArray = 4; //input value
合并后所有值将存储在单个列表中。现在我需要这样的输出。
1
2
111
222
333
444
3
1
555
666
777
888
2
3
999
111
222
333
循环应该运行直到哪个数组长度很大,并从两个数组中检索所有值。
如果数组长度改变了,那么输出比率也应该改变
String[] arr1 = { "1", "2", "3", "4", "5", "6", "7", "8" };
String[] arr2 = { "111", "222", "333", "444", "555" };
int firstArray = 3; //input value
int secondArray = 2; //input value
输出:
1
2
3
111
222
4
5
6
333
444
7
8
1
555
111
所以条件是输出应该包含两个数组的所有值,直到数组的最大长度,输出应该以第二个比率(第二个输入值 - secondArray)完成。
提前致谢。
String[] arr = mergeArrays(arr1, arr2, 2, 3);
System.out.println("Ratio 2:3");
for (String str : arr) {
System.out.println(str);
}
private static String[] mergeArrays(String[] arr1, String[] arr2, int firstArray, int secondArray) {
final String[] ret = new String[arr1.length + arr2.length];
for (int j = 0, k = 0; j < arr1.length || k < arr2.length;) {
if (j < arr1.length) {
do {
ret[j + k] = arr1[j];
j++;
} while (j < arr1.length && (j % firstArray != 0 || k == arr2.length));
}
if (k < arr2.length) {
do {
ret[j + k] = arr2[k];
k++;
} while (k < arr2.length && (k % secondArray != 0 || j == arr1.length));
}
}
return ret;
}
我试过了
但我无法正确输出
这应该有效:
public static void main(String args[]) throws IOException {
int[] array1 = {1, 2, 3, 4, 5, 6, 7, 8};
int[] array2 = {11, 22, 33};
int firstArray = 3;
int secondArray = 5;
for (int a1 = 0, a2 = 0; ;) {
for (int i = 0; i < firstArray; i++)
System.out.println(array1[a1++ % array1.length]);
if (a1 >= array1.length && a2 >= array2.length)
break;
for (int i = 0; i < secondArray; i++)
System.out.println(array2[a2++ % array2.length]);
if (a1 >= array1.length && a2 >= array2.length)
break;
}
}
如果您想在视频上生成一个新数组而不是打印结果,只需声明一个 ArrayList
并使用 add()
方法向其添加元素:
public static void main(String args[]) throws IOException {
int[] array1 = {1, 2, 3, 4, 5, 6, 7, 8};
int[] array2 = {11, 22, 33};
int firstArray = 3;
int secondArray = 5;
ArrayList<Integer> output = new ArrayList();
for (int a1 = 0, a2 = 0; ;) {
for (int i = 0; i < firstArray; i++)
output.add(array1[a1++ % array1.length]);
if (a1 >= array1.length && a2 >= array2.length)
break;
for (int i = 0; i < secondArray; i++)
output.add(array2[a2++ % array2.length]);
if (a1 >= array1.length && a2 >= array2.length)
break;
}
for (int i = 0; i < output.size(); i++)
System.out.println(output.get(i));
}
如果要创建函数:
public ArrayList<Integer> merge(int[] array1, int[] array2, int firstArray, int secondArray) {
ArrayList<Integer> output = new ArrayList();
for (int a1 = 0, a2 = 0; ;) {
for (int i = 0; i < firstArray; i++)
output.add(array1[a1++ % array1.length]);
if (a1 >= array1.length && a2 >= array2.length)
break;
for (int i = 0; i < secondArray; i++)
output.add(array2[a2++ % array2.length]);
if (a1 >= array1.length && a2 >= array2.length)
break;
}
return output;
}
如果您不想 return ArrayList
,只需将其转换为 int[]
我使用 List
而不是数组,因为我认为您无法真正预测结果数组的长度。
public static <T> List<T> merge(List<T> l1, List<T> l2, int r1, int r2) {
List<T> result = new ArrayList<T>();
int index1 = 0;
int index2 = 0;
while (index1 < l1.size() || index2 < l2.size()) {
for (int i = 0; i < r1; ++i)
result.add(l1.get((index1 + i) % l1.size()));
index1 += r1;
if (index2 < l2.size()) {
for (int i = 0; i < r2; ++i)
result.add(l2.get((index2 + i) % l2.size()));
index2 += r2;
}
}
return result;
}
测试代码:
String[] arr1 = { "1", "2", "3" };
String[] arr2 = { "111", "222", "333", "444", "555", "666", "777",
"888", "999" };
System.out.println(merge(Arrays.asList(arr1), Arrays.asList(arr2), 2, 4));
输出:
[1, 2, 111, 222, 333, 444, 3, 1, 555, 666, 777, 888, 2, 3, 999, 111, 222, 333]