我想在每个元素上调用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。