我正在编写一个java程序,其中我不想对数组列表元素使用任何循环。
当然下面的程序将打印输出从0到n而不使用任何循环,因为ArrayList从AbstractCollection中继承了一个带循环的toString()方法。
import java.util.*;
class withoutloop{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
ArrayList<Integer> arr = new ArrayList<>();
int n = scan.nextInt();
for(int i=0;i<=n;i++)
arr.add(i);
System.out.println(arr);
}
}
但是我想使用数组列表中的每个元素进行一些计算而不需要任何循环。就像下面的程序一样
import java.util.*;
class withoutloop{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
ArrayList<Integer> arr = new ArrayList<>();
int n = scan.nextInt();
int m = scan.nextInt();
int count = 0;
for(int i=0;i<=n;i++)
arr.add(i);
for(int i=2;i<=m;i++){
Iterator it = arr.iterator();
while(it.hasNext()){
Integer element = it.next();
if(element%i==0)
count++;
}
}
System.out.println(count);
}
}
现在如果我使用这个程序,这将给我一个我不想要的O(n * m)解决方案。有没有什么办法可以在不使用任何循环的情况下访问数组列表中的所有元素?
答案 0 :(得分:1)
Java 8可以使用IntStream.rangeClosed
使您的代码更简单,但是如果没有设计更智能的算法,您几乎无法避免使用O(n * m)解决方案。
long count = IntStream.rangeClosed(0, n)
.mapToLong(element -> IntStream.rangeClosed(2, m)
.filter(i -> element % i == 0)
.count())
.sum();
System.out.println(count);
在Java 8之前,等效代码如下:
long count = 0;
for (int element = 0; element <= n; element++) {
for (int i = 2; i <= m; i++) {
if (element % i == 0) {
count++;
}
}
}
System.out.println(count);