#java #arrays #sorting
#java #массивы #сортировка
Вопрос:
Мне удалось создать оба массива, однако я не могу понять, как объединить два массива. Каждый учебник, который я вижу, объединяет их как таковые:
int[] arr1 = {3, 3, 5, 6, 8, 9};
int[] arr2 = {3, 4, 5, 6};
// Output: 3, 4, 5, 6, 8, 9
Мне нужно что-то, что выводило бы: 3, 3, 3, 4, 5, 5, 6, 6, 8, 9
Вот код, который я написал до сих пор:
import java.util.Scanner;
public class Merger {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int[] arr1 = new int[10000];
int[] arr2 = new int[10000];
int[] merged = new int[20000];
int a1 = 0;
int a2 = 0;
int size = -1;
int size2 = -1;
int sizecheck = 0;
int size2check = 0;
System.out
.println("Enter the values for the first array, up to 10,000 values, enter a negative number to quit");
for (int i = 0; i < arr1.length; i ) {
arr1[i] = scan.nextInt();
merged[i] = arr1[i];
if (arr1[i] <= 0) {
break;
}
if (size <= arr1[i]) {
size = arr1[i];
sizecheck ;
}
a1 ;
}
System.out
.println("Enter the values for the second array, up to 10,000 values, enter a negative number to quit");
for (int i = 0; i < arr2.length; i ) {
arr2[i] = scan.nextInt();
merged[i a1] = arr2[i];
if (arr2[i] <= 0) {
break;
}
if (size2 <= arr2[i]) {
size2 = arr2[i];
size2check ;
}
a2 ;
}
System.out.println("First Array: ");
for (int i = 0; i < a1; i ) {
System.out.print(" " arr1[i]);
}
System.out.println("nSecond Array: ");
for (int i = 0; i < a2; i ) {
System.out.print(" " arr2[i]);
}
}
}
При этом выводятся оба массива, однако они не объединяются и не сортируются.
Ответ №1:
Вот код ! Может быть более быстрый / простой способ сделать это, но этот работает до тех пор, пока отсортированы 2 массива
public static void main(String[] args) {
int[] a1 = {1, 2, 3, 5};
int[] a2 = {1, 3, 4, 4, 4, 5};
int[] a3 = merge(a1, a2);
for (int i : a3) {
System.out.print(i);
}
}
public static int[] merge(int[] a1, int[] a2) {
int[] a3 = new int[a1.length a2.length];
int indexA1 = 0;
int indexA2 = 0;
for (int i = 0; i < a3.length; i ) {
int n;
if (indexA1 == a1.length amp;amp; indexA2 < a2.length) {
n = a2[indexA2];
indexA2 ;
} else if (indexA1 < a1.length amp;amp; indexA2 == a2.length) {
n = a1[indexA1];
indexA1 ;
} else {
if (a1[indexA1] < a2[indexA2]) {
n = a1[indexA1];
indexA1 ;
} else {
n = a2[indexA2];
indexA2 ;
}
}
a3[i] = n;
}
return a3;
}
Ответ №2:
Я предполагаю, что вы еще не знакомы с потоками, но я хотел бы привести вам пример того, что вы можете с ними сделать.
Добавить импорт
import java.util.stream.IntStream;
Добавьте это в конце вашего основного метода
System.out.println("");
IntStream arr1Stream = IntStream.of(arr1).limit(a1); //creates an InStream with the first a1 values of arr1
IntStream arr2Stream = IntStream.of(arr2).limit(a2);
int[] both = IntStream.concat(arr1Stream, arr2Stream).sorted().toArray(); //combines the two streams, sorts them an converts them to an Array
System.out.println(Arrays.toString(both)); //easy way to print an array
Ответ №3:
Самый простой способ — использовать поток.
int[] arr1 = {3, 3, 5, 6, 8, 9};
int[] arr2 = {3, 4, 5, 6};
- Поток обоих массивов.
- Сопоставьте их с одним IntStream
- сортировка их
- преобразование в массив
int [] combined = Stream.of(arr1,arr2)
.flatMapToInt(Arrays::stream)
.sorted()
.toArray();
System.out.println(Arrays.toString(combined));
С принтами
[3, 3, 3, 4, 5, 5, 6, 6, 8, 9]
Непоточный подход может быть выполнен следующим образом:
// increase arr1 to make room for arr2
int oldLen = arr1.length;
arr1 = Arrays.copyOf(arr1, arr1.length arr2.length);
// copy arr2 starting at 0, to arr1 starting at the old length
// positon of arr1 for a length of arr2
System.arraycopy(arr2, 0, arr1, oldLen, arr2.length);
// sort and print
Arrays.sort(arr1);
System.out.println(Arrays.toString(arr1));
С принтами
[3, 3, 3, 4, 5, 5, 6, 6, 8, 9]
Хотя в вашем заданном вопросе ничего не говорилось о merging
отсортированных массивах, вот как вы это сделаете.
Алгоритм прост. Просто выполните итерацию по каждому массиву и сравните текущие значения.
- если
arr1[i] <= arr2[k]
скопироватьarr1[i] to result
, продвинутьi
на1
- остальное скопируйте
arr2[k] to result
, продвиньтесьk
1
вперед. - во всех случаях индекс результата,
r
, увеличивается на1
public int[] merge(int[] arr1, int[] arr2) {
// result array
int[] result = new int[arr1.length arr2.length];
int r = 0;
int k = 0;
int i = 0;
// Iterate thru the arrays, copying the lowest or equal value
// to the target array. This process will cease when one of the arrays
// has been fully processed.
for (; i < arr1.length amp;amp; k < arr2.length; ) {
for (; k < arr2.length amp;amp; i < arr1.length;) {
if (arr1[i] <= arr2[k]) {
result[r ] = arr1[i ];
}else {
result[r ] = arr2[k ];
}
}
}
Достигнув этого уровня в алгоритме, один из массивов должен быть полностью обработан. Так что попробуйте скопировать оба. Для пустого массива в while loop
основном действует как оператор if.
while (i < arr1.length) {
result[r ] = arr1[i ];
}
while (k < arr2.length) {
result[r ] = arr2[k ];
}
// return the result
return resu<
}
Ответ №4:
public class Merger {
public static void main(String[] args) {
int[] arr1 = { 3, 3, 5, 6, 8, 9 };
int[] arr2 = { 3, 4, 5, 6 };
int[] res = merge(arr1, arr2);
System.out.println(Arrays.toString(res));
}
public static int[] merge(int[] arr1, int[] arr2) {
int[] res = new int[arr1.length arr2.length];
for (int i = 0, a1 = 0, a2 = 0; i < res.length; i ) {
if (a1 == arr1.length)
res[i] = arr2[a2 ];
else if (a2 == arr2.length)
res[i] = arr1[a1 ];
else
res[i] = arr1[a1] <= arr2[a2] ? arr1[a1 ] : arr2[a2 ];
}
return res;
}
}
Ответ №5:
Простое решение может быть написано с использованием классов, Arrays
и System
.
Шаги:
- Скопируйте элементы
arr1[]
в новый массив (скажем,output[]
), размер которого равен сумме размеров заданных массивов. - Скопируйте элементы
arr2[]
после элементаarr1[]
вoutput[]
- Сортировка
output[]
ДЕМОНСТРАЦИЯ:
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] arr1 = { 3, 3, 5, 6, 8, 9 };
int[] arr2 = { 3, 4, 5, 6 };
// Copy elements of arr1[] into a new array whose size is the sum of the sizes
// of the given arrays
int[] output = Arrays.copyOf(arr1, arr1.length arr2.length);
// Copy the elements of arr2[], after the element of arr1[], into output[]
System.arraycopy(arr2.clone(), 0, output, arr1.length, arr2.length);
// Sort output[]
Arrays.sort(output);
// Display output[]
System.out.println(Arrays.toString(output));
}
}
Вывод:
[3, 3, 3, 4, 5, 5, 6, 6, 8, 9]
Ответ №6:
System.arraycopy
Для этой цели вы можете использовать метод:
int[] arr1 = {3, 3, 5, 6, 8, 9};
int[] arr2 = {3, 4, 5, 6};
// create a new array of total length
int[] arr3 = new int[arr1.length arr2.length];
// copy first array to the beginning of the total array
System.arraycopy(arr1, 0, arr3, 0, arr1.length);
// copy second array to the end of the total array
System.arraycopy(arr2, 0, arr3, arr1.length, arr2.length);
// sort the total array
Arrays.sort(arr3);
System.out.println(Arrays.toString(arr3));
// [3, 3, 3, 4, 5, 5, 6, 6, 8, 9]