给定一个int数组和一个索引k。任务是输出左移由k旋转的数组。
...例如
a = [1,2,3,4,5], k = 4
Output:
5 1 2 3 4
在Javascript中,代码是:
var result = a.slice(d).join(' ') + ' ' + a.slice(0, d).join(' ')
我真的很难在Java中找到简洁的等价物。
答案 0 :(得分:2)
如你所说,你只需要输出,这将有效:
int[] a = new int[]{1, 2, 3, 4, 5};
int k = 4;
for (int i = 0; i < a.length; i++) {
System.out.print(a[(i + k) % a.length] + " ");
}
答案 1 :(得分:1)
这取决于你对简洁的定义,我想。这里有一些Java 8 Stream功能可以按照与JS代码类似的方式执行您想要的功能,并且可以说有点简洁。
int[] arr = {1, 2, 3, 4, 5};
int k = 4;
String result = Arrays.stream(arr).skip(k).mapToObj(Integer::toString).collect(Collectors.joining(" ")) + " " + Arrays.stream(arr).limit(k).mapToObj(Integer::toString).collect(Collectors.joining(" "));
分解每一位的作用:
Arrays.stream(arr)
只创建一个Stream int
s(具体而言,IntStream
,因为int
,作为内置类型,必须拥有自己的包装器流类而不是通用的Stream<T>
)。skip(k)
实际上丢弃了与提供的输入一样多的元素,因此我们可以从索引转发的部分开始。mapToObj(Integer::toString)
是我们将Stream
从IntStream
转换为Stream<String>
的方式,以便我们可以将其加入单String
。它接受Stream
中的每个元素并将Integer.toString方法应用于它,即如果Stream
的每个元素又被称为int
,它就像调用{ {1}}。我们现在剩下Integer.toString(int)
Stream
代表数字。String
获取每个值,并将其提供给collect(Collectors.joining(" "))
。 Collector
取Collector
个并将它们缩减为单个对象。在这种情况下,Stream
joining
接受每个对象并将它们全部连接到一个字符串,我们提供的参数是它使用的分隔符。Collector
,它只占用limit(k)
的第一个k
元素而忽略其余部分。你的JS示例有点啰嗦(必要的部分原因是Java的强类型,部分原因是Java数组不是对象,因此不做任何有用的事情他们自己),但相当容易理解和非常强大。