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

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

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

  1. public class Four {
  2. static void rotateByN(int[] in, int n) {
  3. for (int l = 1; l <= n; l++) {
  4. int tmp = in[0];
  5. for (int i = 1; i < in.length; i++) {
  6. in[i - 1] = in[i];
  7. }
  8. in[in.length - 1] = tmp;
  9. }
  10. }
  11. public static void main(String[] args) {
  12. int[] arr = { 2, 7, 6, 1, 0 };
  13. rotateByN(arr, 3);
  14. for (int r : arr) {
  15. System.out.println(r);
  16. }
  17. }
  18. }

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

56lgkhnf

56lgkhnf1#

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

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

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

  1. static void rotateByN(int[] arr, int n) {
  2. System.arraycopy(Stream
  3. .of(Arrays.copyOfRange(arr, n, arr.length),
  4. Arrays.copyOfRange(arr, 0, n))
  5. .flatMapToInt(Arrays::stream)
  6. .toArray(), 0, arr, 0, arr.length);
  7. }

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

  1. static void rotateByN(int[] arr, int n) {
  2. System.arraycopy(ArrayUtils.addAll(
  3. Arrays.copyOfRange(arr, n, arr.length),
  4. Arrays.copyOfRange(arr, 0, n)),
  5. 0, arr, 0, arr.length);
  6. }
展开查看全部

相关问题