Расчесывание двух массивов в порядке возрастания с неизвестными значениями внутри массива

#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 .

Шаги:

  1. Скопируйте элементы arr1[] в новый массив (скажем, output[] ), размер которого равен сумме размеров заданных массивов.
  2. Скопируйте элементы arr2[] после элемента arr1[] в output[]
  3. Сортировка 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]