我的问题涉及我在学习 Java 时所做的练习中的一种方法。我明白该程序应该做什么(一种方法确定数字是否为素数,另一种方法仅存储数组中的素数。我明白了。
我也了解数组和数组列表有何不同。我也知道什么是方法。但由于某种原因,我无法理解这两行放在一起时发生的事情。
public ArrayList<Integer> onlyPrimes(int[] numbers) {
ArrayList<Integer> primes = new ArrayList<Integer>();
这就像将 arrayList 与方法合并并使用数组作为参数。有人可以用一个“非常简单的例子/解释”来向初学者解释这里发生的事情吗?我不明白这一切是如何运作的。 非常感谢专业人士的帮助!
public boolean isPrime(int number) {
if (number==2) {
return true;
} else if (number<2) {
return false;
}
for(int i=2;i<number;i++) {
if(number % i==0) {
return false;
}
}
return true;
}
public ArrayList<Integer> onlyPrimes(int[] numbers) {
ArrayList<Integer> primes = new ArrayList<Integer>();
for (int number : numbers) {
if (isPrime(number)) {
primes.add(number);
}
}
return primes;
}
public static void main(String[] args) {
PrimeDirective pd = new PrimeDirective();
int[] numbers = {6, 29, 28, 33, 11, 100, 101, 43, 89};
System.out.println(pd.isPrime(7));
System.out.println(pd.isPrime(28));
System.out.println(pd.isPrime(2));
System.out.println(pd.isPrime(0));
System.out.println(pd.onlyPrimes(numbers));
}
}
我能理解你的困惑。这两行内容发生了很多事情。
第一行定义了
方法的签名。该方法的名称为 onlyPrimes
。此方法将返回对
object的 reference,即
ArrayList
类的实例(或返回 null
)。
ArrayList
对象将包含零个、一个或多个元素,每个元素都是对 Integer
类的对象的引用。当程序员调用这个 onlyPrimes
方法时,她将传递一个原始 []
值的数组 (int
)。在我们的 onlyPrimes
方法体内,这个传递的数组将被称为 numbers
。下一行是我们名为 onlyPrimes
的方法主体中的第一行。请注意我如何更正您的缩进,以明确 (a) 方法的声明和 (b) 该方法的主体之间的关系。
{
大括号标记声明方法体的开始。方法体的第一行声明了一个名为 primes
的对象引用变量。该变量应保存对类
ArrayList
的实例的引用。该实例是 Integer
类的对象集合。 EQUALS 符号将对象引用分配给我们的变量 primes
。EQUALS 符号后面的代码实例化一个新集合,即类 ArrayList
的对象。该集合是空的,不包含任何元素,但能够保存对
Integer
类的对象的引用。实例化返回对新集合对象的引用。该引用被分配为我们以名称 primes
声明的对象引用变量的内容。
我建议您学习一个更简单的教程,该教程将介绍此代码的各个部分。一个不错的起点是 Oracle 公司免费提供的 Java 教程。另一个优秀的教程是 Head First Java,第 3 版 作者:Kathy Sierra、Bert Bates、Trisha Gee。
我会对该代码进行一些更改。我会将方法参数标记为
final
,以确保在方法主体中没有其他引用分配给
numbers
。我们不需要在第二行重复 Integer
作为列表的类型。现代 Java 中的编译器可以推断出该类型。所以只需使用
<>
。通常最好使用提供所需功能的尽可能最高的超类或超接口。 ArrayList
的超级接口是
List
。在 Java 21 及更高版本中,更高的超级接口是
SequencedCollection
(请参阅JEP 431)。 我是认为通常最好返回“不可修改的集合”的人之一。因此,在填充
ArrayList
生成一个新的不可修改的 List.copyOf
。
我会让代码文本呼吸,添加一些空格字符。这种挤在一起的风格是一种历史文物,可以追溯到 80 列打孔卡和终端
时代。
public SequencedCollection < Integer > onlyPrimes( final int[] numbers ) {
SequencedCollection < Integer > primes = new ArrayList<>();
…
return List.copyOf( primes ) ;
}