Мне интересно, есть ли какие-нибудь утилиты (библиотеки) для объединения двух отсортированных массивов всего в 1 строку.
Я знаю сортировку слиянием, но я просто хотел бы, чтобы вспомогательная функция слияния поддерживала любую существующую библиотеку?
Это отвечает на ваш вопрос: Stream.concat(Arrays.stream(array1), Arrays.stream(array2)).sorted(comparator).toArray(ArrayClass[]::new);
@JacobG. Я подозреваю, что временная сложность предложенного вами метода составляет O (n log (n)). Он отвечает на вопрос, но, похоже, делает гораздо больше, чем необходимо.
@LakshayGarg Я согласен; Я никогда не говорил, что это эффективно;)
Используйте CollectionUtils.collate
из Apache Commons.
Из документации:
Merges two sorted Collections, a and b, into a single, sorted List such that the natural ordering of the elements is retained. Uses the standard O(n) merge algorithm for combining two sorted lists.
Вот пример
import static java.util.Arrays.asList;
import java.util.List;
import org.apache.commons.collections4.CollectionUtils;
public class MergeSortedArrays {
public static void main(String[] args) {
Integer a[] = new Integer[]{2, 4, 6, 8, 10};
Integer b[] = new Integer[]{1, 3, 4, 5, 6};
List<Integer> merged = CollectionUtils.collate(asList(a), asList(b));
}
}
Библиотека также предоставляет еще несколько полезных перегрузок.
// 1. discards duplicates
static <O extends Comparable<? super O>> List<O> collate(Iterable<? extends O> a, Iterable<? extends O> b, boolean includeDuplicates)
// 2. uses a custom comparator
static <O> List<O> collate(Iterable<? extends O> a, Iterable<? extends O> b, Comparator<? super O> c)
// 3. uses a custom comparator and discards duplicates
static <O> List<O> collate(Iterable<? extends O> a, Iterable<? extends O> b, Comparator<? super O> c, boolean includeDuplicates)
Разве создание простой функции слияния не было бы лучше, чем добавление целой библиотеки для такой простой задачи?
У вас есть array1 (0,1,2,2,3,4) и array2 (0,2,4,5) и returnArray Посмотрите на первые 2 значения и выберите самое низкое, если они совпадают.
Добавьте это значение в returnArray.
Продолжайте удалять это значение из выбранного массива
Повторяйте процесс, пока не объедините
Вы можете просто увеличить целое число вместо удаления из-за проблем с эффективностью.
Редактировать Упс, не знал, что вы уже знаете сортировку слиянием
Правильно, добавление библиотеки только ради этой функции, вероятно, не такая уж хорошая идея. Однако ряд библиотек, таких как Google Guava и Apache Commons, почти всегда присутствует в любом java-проекте нетривиального размера / сложности. В таких случаях хорошо иметь хорошо протестированную библиотечную функцию, которая сделает всю работу за вас.
Действительно. Я часто использую и гуаву, и обыкновенные в своих проектах, ура!
Конечно. Сортировка слиянием Google. Вы найдете их много. Вы знаете, что запросы на внешние ресурсы не по теме?