【问题标题】:Most effective way to split a sorted array around a key围绕键拆分排序数组的最有效方法
【发布时间】:2017-04-14 03:41:53
【问题描述】:

假设我有一个从 1 到 10 的排序数字数组。 我想根据一个关键元素拆分数组。 比如说:

   Key  Transformed Array
    1   [2-10]
    5   [2-4],[6-10]
    6   [2-4],[7-10]
    7   [2-4],[8-10]
    8   [2-4],[9-10]
    10  [2-4],[9-9]

如果键是连续的,我不打算迭代, 意思是,

Keys 5,6,7 and 8 have to be processed in one step breaking 
[2-4],[6-10] into [2-4],[9-10]

【问题讨论】:

  • 你的问题陈述不清楚。另外,到目前为止您尝试了什么?,请也发布。
  • 更具体地说,我在列表(A)中有一系列连续数字。我还有一个要从列表中删除的数字列表(B)。删除列表(A)之间的数字应该导致列表(A)被分成两个较小的列表,删除列表开头或结尾的数字应该缩小列表。我在数据库中有这些数字,我计划在 Java 层中进行此计算,因为它需要使用 SQL 来完成。

标签: java arrays algorithm split


【解决方案1】:

最简单的选择是使用Collectors.partitioningBy 方法以及Java 8 的StreamsCollectors

import java.util.stream.Collectors;
import java.util.Map;
import java.util.List;
import java.util.Arrays;

public class Partition {

    public static String join(int[] a, String d) {
        return Arrays.stream(a).mapToObj(String::valueOf)
                     .collect(Collectors.joining(d));
    }

    public static void main(String[] args) {
        int[] v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int k = 4;
        Map<Boolean, List<Integer>> partitions = Arrays.stream(v)
            .boxed()
            .filter(n -> n != k)
            .collect(Collectors.partitioningBy(n -> n < k));

        int[] vlt = partitions.get(true).stream()
                              .mapToInt(Integer::intValue).toArray();
        int[] vgt = partitions.get(false).stream()
                              .mapToInt(Integer::intValue).toArray();

        System.out.println("vlt: {" + join(vlt, ", ") + "}");
        System.out.println("vgt: {" + join(vgt, ", ") + "}");
    }

}

附带说明一下,我个人只会使用List&lt;Integer&gt; 而不是int[],如果可以选择跳过转换。

【讨论】:

  • 我会试试这个
  • 清理了一下。
  • 感谢您的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 2013-09-10
相关资源
最近更新 更多