如何在一行中为 Java 数组中的范围设置相同的值?



>假设我有一个包含 100 个元素的数组,我希望一定范围的索引具有一定的值。例如,索引 0 到 10 将具有"Bob",索引 11 - 57 将具有"Jake",索引 58-99 将具有"John"。可以一行做吗?谢谢

是的。您可以使用IntStream.range(int, int)生成范围,然后映射到具有嵌套三元的String。喜欢

System.out.println(Arrays.toString(IntStream.range(0, 100)
.mapToObj(i -> i < 11 ? "Bob" : i < 58 ? "Jake" : "John")
.toArray()));

这是Bob的单行。

for(int i=0; i<10; i++) myArray[i]="Bob";

我会写一个方法:

static void fillRange(String[] arr, int from, int to, String val){
for(int i=from; i<=to; i++) arr[i]=val;
}

然后调用它:

fillRange(myArray, 0, 10, "Bob"); fillRange(myArray, 11, 57, "Jake");...

但是您必须确保您的数组已经包含所需的范围:

int arrLength = 99;
....
String[] myArray = new String[arrLength];

在许多语言中,在元组中设置所有参数并将它们评估为列表推导会很简单。但是,Java并不适合在单个语句中执行此类操作。

Arrays.stream(new Object[] {
new Object[] {0,10,"Bob"},
new Object[] {11,57,"Jake"},
new Object[] {58,99,"John"}
}).forEach(objs -> Arrays.fill(myArray,
(int)(((Object[]) objs)[0]),
((int)(((Object[]) objs)[1]))+1,
((Object[]) objs)[2])
);

或者,如果你愿意滥用三元运算符,你可以使用这个可爱的宝石(归功于约翰内斯·库恩(:

Arrays.setAll(myArray, i -> i <= 10 ? "Bob" : i <= 57 ? "Jake" : "John");

然而,这个故事的寓意是:仅仅因为你可以在一行中做某事,并不意味着你应该这样做。清晰度更重要。

最新更新