【问题标题】:Is there any function to perform Circular Left Shift in an array between index i and index j (both inclusive) by in java在java中是否有任何函数可以在索引i和索引j(包括两者)之间的数组中执行循环左移
【发布时间】:2019-03-13 16:38:03
【问题描述】:

我想在索引 i 和索引 j(包括两者)之间的数组中执行循环左移。

例如:考虑数组A,例如,

int[] A = {1, 2, 3, 4, 5};

如果我想在给定数组 A 中执行 0(索引 i)和 2(索引 j)之间的循环左移,输出为:

A = {2, 3, 1, 4, 5}

java中有没有可以执行这种操作的内置函数。

我不是在问如何将数组循环左移 n 次。我的问题是循环左移数组中的一些元素,正如我通过示例所展示的那样。

【问题讨论】:

    标签: java arrays function


    【解决方案1】:

    是的,它有一个内置函数:Collections.rotate

    例如,

    Collections.rotate(Arrays.asList(A).subList(i, j+1), -1);
    

    更新:

    这不适用于原始数组,因为Arrays.asList 不会为您进行装箱。您需要以某种方式创建一个Integer[]List<Integer>,这不是很优雅的方式。

    【讨论】:

    • 这个函数在整数数组上使用时会出现越界异常,但在字符串数组上可以正常工作
    • @meisner97 这是因为Arrays.asList 不适用于原始类型数组。见stackoverflow.com/questions/1073919/…
    【解决方案2】:

    对于集合,有许多可用的操作。 对于数组,Arrays 类提供了copyOfRange 和其他方法, 但没有任何需要的原位操作。你可以这样做:

    int[] a = {1, 2, 3, 4, 5};
    final int lwb = 0;
    final int upb = 2;
    

    使用 lambda:

    int alwb = a[lwb];
    Arrays.setAll(a, i -> 
        i < lwb || i > upb ? a[i]
        i < upb -> a[i+1] : alwb
    );
    

    或者最好的:

    int alwb = a[lwb];
    System.arraycopy(a, lwb + 1, a, lwb, upb - lwb - 1);
    a[upb] = alwb;
    

    【讨论】:

      猜你喜欢
      • 2016-05-17
      • 1970-01-01
      • 2020-02-03
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      • 2020-02-19
      • 2023-04-05
      • 2018-09-04
      相关资源
      最近更新 更多