在跟踪索引的同时迭代集合的正确方法



我想在每个元素上调用someemethod后将集合映射到数组。我应该使用foreach循环和" I "变量,还是使用常规的for循环和迭代器?

int[] arr = new int[set.size()];
int i = 0;
for(int ele : set) {
arr[i] = someMethod(ele);
i++;
}

int[] arr = new int[set.size()];
Iterator<Integer> iterator = set.iterator();
for(int i=0; i<set.size(); i++) {
arr[i] = someMethod(iterator.next().intValue());
}

这两种方法都很好,但是for循环比forEach循环稍微快一些,

下面给出了将set转换为数组的其他方法。您可以使用toArray()函数:

int[] arr = new int[set.size()];
arr = set.toArray(arr);

或者您可以在Java 8或更高版本中使用流:

int[] arr = set.stream().toArray(int[] ::new);

另一种方法是使用Arrays.copyOf

int[] arr = Arrays.copyOf(set.toArray(), set.size(), Integer[].class);

br

你的两个循环都是等价的。

您可以使用流来编写一行代码,其中流为您执行循环。

int[] arrayOfInts =
Set
.of( 1 , 2 , 3 )
.stream()
.mapToInt( Integer :: intValue )
.map( integer -> Math.multiplyExact( integer , integer ) )
.sorted()
.toArray();

arrayOfInts = [1,4,9]

两个循环都可以

你的两个循环都很好。

选择最容易阅读和理解的。对我来说,这通常是For -each语法,如第一个循环所示。

顺便说一下,第一个循环可以缩短。i++语法提取并利用递增前的i的值。因此,可以将i++嵌套在数组索引访问器中。
Set < Integer > set = Set.of( 1 , 2 , 3 );
int[] arr = new int[ set.size() ];
int i = 0;
for ( int element : set ) {
arr[ i++ ] = Math.multiplyExact( element , element );  // Auto-boxing converts `Integer` objects into `int` primitive values.
}
System.out.println( "arr = " + Arrays.toString( arr ) );

arr = [1,9,4]

流代替循环

Pranav Choudhary的答案是正确的。但是你也提到想要在分配给数组之前应用一个方法来修改你的数字。

Java流使得在收集过程中执行这样的修改变得很容易。

定义Integer对象的Set

Set < Integer > set = Set.of( 1 , 2 , 3 );

创建一个int原语流,从Integer对象中装箱。

IntStream intStream = set.stream().mapToInt( Integer :: intValue );

应用你的修改。这里我们对每个数平方。Math.multiplyExact方法很方便,因为如果超出32位int类型的限制,它将抛出ArithmeticException。我们将每个结果正方形收集为数组中的int

int[] arrayOfInts = intStream.map( integer -> Math.multiplyExact( integer , integer ) ).toArray();

转储到控制台

system . out。println("arrayOfInts = "+数组。

运行时。

arrayOfInts = [9,4,1]

注意输出的顺序。根据定义,Set没有确定的迭代顺序。为了强调这一点,Set.of方法保留使用随机改变其迭代的Set实现的权利。因此,每次运行此代码时,您可能会看到不同的结果顺序。

如果您关心顺序,请将其添加到流工作中。添加呼叫sorted()

int[] arrayOfInts = intStream.map( integer -> Math.multiplyExact( integer , integer ) ).sorted().toArray();

运行时,我们得到一致的排序。查看此代码运行在IdeOne.com。

arrayOfInts = [1,4,9]

我并不推荐这样做,但是我们可以把这段代码变成一行代码。

int[] arrayOfInts = Set.of( 1 , 2 , 3 ).stream().mapToInt( Integer :: intValue ).map( integer -> Math.multiplyExact( integer , integer ) ).sorted().toArray();

或:

int[] arrayOfInts =
Set
.of( 1 , 2 , 3 )
.stream()
.mapToInt( Integer :: intValue )
.map( integer -> Math.multiplyExact( integer , integer ) )
.sorted()
.toArray();

查看此代码运行在IdeOne.com。

arrayOfInts = [1,4,9]

两个版本都是正确的,因为它们都给出了相同的结果。

然而,在我看来,第一个版本更可取。

  • 对于一个普通的Java程序员来说更容易理解。
  • 更简洁。更少的代码行。简单的语句。
  • 它可能会更快…除非优化器非常聪明。

如果是我,我会保存一行,然后这样写:

for(int ele : set) {
arr[i++] = someMethod(ele);
}

但那只是我的老C习惯在闪烁。


正如其他人指出的那样,在Java 8+中有一种更简洁的方式来编写它;例如,请看这个答案

With java8:

Integer[] arr = set.stream().map(element -> doSomething(element)).toArray(Integer[]::new);

其中doSomething()是你可以调用的方法-

在每个元素上调用someemethod。

相关内容

  • 没有找到相关文章

最新更新