在java中仅使用一个分号旋转int数组

eqfvzcg8  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(311)

我正在为java做一系列自愿的任务,包括使用基本的数组和方法。我一直做得很好,直到遇到严重的障碍。
最初的任务是创建一个方法 rotateByN ,它应该获取一个int数组并将其旋转n步(并影响输入数组,而不是返回一个新数组)。很简单:

public class Four {
    static void rotateByN(int[] in, int n) {
        for (int l = 1; l <= n; l++) {
            int tmp = in[0];
            for (int i = 1; i < in.length; i++) {
                in[i - 1] = in[i];
            }
            in[in.length - 1] = tmp;
        }
    }

    public static void main(String[] args) {
        int[] arr = { 2, 7, 6, 1, 0 };
        rotateByN(arr, 3);
        for (int r : arr) {
            System.out.println(r);
        }
    }
}

但是,接下来的任务是将方法体中使用的分号数量减少到只有一个。我花了大约一个小时的时间在各种各样的文档中搜寻,但似乎没有什么能让我达到目的。
更令人沮丧的是,我们没有弄清楚是否可以调用以前创建的函数 rotate (它做同样的事情,但总是正好一次)n次,但是同样,for循环需要更多分号,这是我们没有的。
我不想这么直截了当地提出要求,但我完全没有选择余地,任何形式的意见都将不胜感激。
再问了几句,结果就跟打电话一样无聊了 rotate 方法一遍又一遍。因为这只能(我认为)在for的头上加上更多的分号,也许它们不算在内。

56lgkhnf

56lgkhnf1#

你可以用 Arrays.stream(int[],int,int) 方法两次获得具有指定数组范围的两个流:近和远,然后将它们交换并展平为一个流-返回新数组。那你可以用 System.arraycopy 方法将旧数组的内容替换为新数组的内容。带有一个分号的长路径:

static void rotateByN(int[] arr, int n) {
    System.arraycopy(Stream
            .of(Arrays.stream(arr, n, arr.length),
                    Arrays.stream(arr, 0, n))
            .flatMapToInt(Function.identity())
            .toArray(), 0, arr, 0, arr.length);
}
public static void main(String[] args) {
    int[] arr = {2, 7, 6, 1, 0};
    rotateByN(arr, 3);
    System.out.println(Arrays.toString(arr)); // [1, 0, 2, 7, 6]
}

或者你可以用 Arrays.copyOfRange(int[],int,int) 方法。想法是一样的:

static void rotateByN(int[] arr, int n) {
    System.arraycopy(Stream
            .of(Arrays.copyOfRange(arr, n, arr.length),
                    Arrays.copyOfRange(arr, 0, n))
            .flatMapToInt(Arrays::stream)
            .toArray(), 0, arr, 0, arr.length);
}

或者没有你可以使用的流 ArrayUtils.addAll(int[],int[]) 方法:

static void rotateByN(int[] arr, int n) {
    System.arraycopy(ArrayUtils.addAll(
            Arrays.copyOfRange(arr, n, arr.length),
            Arrays.copyOfRange(arr, 0, n)),
            0, arr, 0, arr.length);
}

相关问题