在Java中有一种干净的方式将int数组的一部分输出为字符串吗?

时间:2017-07-11 14:52:06

标签: java arrays string stream

给定一个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中找到简洁的等价物。

2 个答案:

答案 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)是我们将StreamIntStream转换为Stream<String>的方式,以便我们可以将其加入单String。它接受Stream中的每个元素并将Integer.toString方法应用于它,即如果Stream的每个元素又被称为int,它就像调用{ {1}}。我们现在剩下Integer.toString(int) Stream代表数字。
  • String获取每个值,并将其提供给collect(Collectors.joining(" "))CollectorCollector个并将它们缩减为单个对象。在这种情况下,Stream joining接受每个对象并将它们全部连接到一个字符串,我们提供的参数是它使用的分隔符。
  • 查看过程的后半部分,唯一真正不同的部分是Collector,它只占用limit(k)的第一个k元素而忽略其余部分。

你的JS示例有点啰嗦(必要的部分原因是Java的强类型,部分原因是Java数组不是对象,因此不做任何有用的事情他们自己),但相当容易理解和非常强大。