java - 将 4 个排序数组合并为一个

标签 java arrays algorithm sorting array-merge

我有这个方法可以将 2 个排序的数组合并成一个排序的数组:

    public void merge(T[] a, int l1, int r1, T[] b, int l2, int r2, T[] c, int l3) {
        while (l1 < r1 && l2 < r2) {
            if (a[l1].compareTo(b[l2]) < 0) {
                c[l3++] = a[l1++];
            } else
                c[l3++] = b[l2++];
        }

        while (l1 < r1)
            c[l3++] = a[l1++];
        while (l2 < r2)
            c[l3++] = b[l2++];
    }

但现在我想用 4 arrays 一次完成。

我尝试了很长时间来想出一个解决方案,但并没有真正成功。有人知道怎么做吗?

最佳答案

使用 Java8 流有一种比手动执行此操作更简单的方法:

  1. 将所有数组合并为一个流(我使用了 2 个,但您可以使用任意多个):
int[] arr1 = {1, 7, 10};
int[] arr2 = {1, 2, 4, 9};

Stream<int[]> ints = Stream.of(arr1, arr2);
  1. 然后 flatMap 并在流中排序它们:
IntStream intStream = ints.flatMapToInt(Arrays::stream).sorted();

当您打印它们时,您会看到所有排序的数字:

intStream.forEach(System.out::println);

1
1
2
4
7
9
10

结合在一个函数中,它看起来像这样:

public int[] merge(int[]... arrays) {
  return Stream.of(arrays)
                 .flatMapToInt(Arrays::stream)
                 .sorted()
                 .toArray();
}

编辑:流的优点是,您可以根据需要进一步修改值。例如通过利用 distinct 函数,您可以轻松删除重复项:

intStream = intStream.distinct();
intStream.forEach(System.out::println);

1
2
4
7
9
10

关于java - 将 4 个排序数组合并为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72177195/

相关文章:

javascript - 来自 JSON 的 Highcharts 堆积柱形图未绘制正确的值

algorithm - 坚持解决最小生成树问题

c++ - 访问 char* 或 std::string 的元素是否更快?

java - 如何在 Bean Validation 1.0 中构造 ConstraintViolationException?

java - 在 Interceptor.intercept() 中,我如何知道 Action 是否已经执行?

java - 关于Java jar文件中Manifest的问题

Ruby:对象/类数组

algorithm - 如何检测字符串的哈希算法?

java - 装箱/拆箱多维原始数组的最有效方法

java - java程序的线程内语义