gpt4 book ai didi

java - 不使用任何循环对 ArrayList 元素进行操作

转载 作者:行者123 更新时间:2023-12-01 09:17:28 25 4
gpt4 key购买 nike

我正在编写一个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) 的解决方案,这是我不想要的。有什么方法可以在不使用任何循环的情况下访问数组列表中的所有元素?

最佳答案

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);

关于java - 不使用任何循环对 ArrayList 元素进行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40441087/

25 4 0