【问题标题】:is there a clean way in Java to output part of an int array as a string?Java中是否有一种干净的方法可以将int数组的一部分输出为字符串?
【发布时间】:2017-12-15 17:14:05
【问题描述】:

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

【问题讨论】:

标签: java arrays string stream


【解决方案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) 只是创建一个Streamints(具体来说,一个IntStream,因为int,作为一个内置类型,必须有它自己的包装流类而不是通用的Stream<T>)。
  • skip(k) 基本上丢弃了与提供的输入一样多的元素,因此我们可以从索引开始的部分开始。
  • mapToObj(Integer::toString) 是我们如何将 StreamIntStream 转换为 Stream<String>,以便我们可以将其合并为单个 String。它获取Stream 中的每个元素并对其应用Integer.toString 方法,即如果Stream 的每个元素依次称为int,则就像调用Integer.toString(int)。我们现在剩下一个 StreamStrings 代表数字。
  • collect(Collectors.joining(" ")) 获取每个值,并将其提供给 CollectorCollectors 采用 Streams 并将它们简化为单个对象。在这种情况下,joiningCollector 接受每个对象并将它们全部连接到一个字符串中,我们提供的参数是它使用的分隔符。
  • 查看过程的后半部分,唯一真正不同的部分是 limit(k),它仅采用 Stream 的第一个 k 元素并忽略其余部分。

您的 JS 示例有点冗长(部分原因是 Java 的强类型,部分原因是 Java 数组不是对象,因此它们本身不会做任何有用的事情),但相当容易理解并且非常强大。

【讨论】:

  • String result=IntStream.concat(Arrays.stream(arr,k,arr.length), Arrays.stream(arr,0,k)) .mapToObj(Integer::toString).collect(Collectors.joining(" "));
【解决方案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] + " ");
}

【讨论】:

  • 我希望 Java 中有一些 appendExceptOnLastIteration(" ") 之类的东西。
猜你喜欢
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 2019-07-02
  • 2014-02-28
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 2021-09-13
相关资源
最近更新 更多