抱歉这个愚蠢的问题,但我似乎无法在谷歌上找到答案。我编写了一个类,在类中有一个构造函数,它创建了一个arraylist,在同一个类中有一个方法,它通过创建一个迭代器对象来遍历数组列表。但是,正如我的代码所示,它不能识别arraylists名称,我应该将数组列表存储在类变量中,还是将其作为参数传递给方法?
这里通常最好的做法是什么,这总是让我感到兴奋?
如果你不能按照我有些愚蠢的解释,我的代码如下!道歉 !非常感谢您阅读:)
import java.util.*;
public class Primes {
public Primes( int initialCapacity) {
ArrayList<Integer> listOfPrimeNumbers = new ArrayList<Integer>(initialCapacity);
//how do I get the above...
int index = 2;
while (index != listOfPrimeNumbers.size())
{
if (isPrime(index))
{
listOfPrimeNumbers.add(index);
}
index++;
}
}
public static boolean isPrime(int candidateNo) {
Iterator<Integer> iter = listOfPrimeNumbers.iterator( );
//in here ! ?
i=2;
while ( iter.hasNext( ) ) {
if (candidateNo%i==0 && i!=1) {
return false;
}
else
return true;
}
}
(另外,如果你看到我的代码出现任何可怕的错误,请不要害怕打电话给我,更有建设性的批评越好!) }
答案 0 :(得分:2)
您可以为ArrayList定义一个私有var,并在构造函数中初始化此变量。 现在您可以访问类中的列表:) 希望有所帮助。
import java.util.*;
public class Primes {
private ArrayList<Integer> listOfPrimeNumbers;
public Primes( int initialCapacity) {
listOfPrimeNumbers = new ArrayList<Integer>(initialCapacity);
//how do I get the above...
int index = 2;
while (index != listOfPrimeNumbers.size())
{
if (isPrime(index))
{
listOfPrimeNumbers.add(index);
}
index++;
}
}
public static boolean isPrime(int candidateNo) {
Iterator<Integer> iter = listOfPrimeNumbers.iterator( );
//in here ! ?
i=2;
while ( iter.hasNext( ) ) {
if (candidateNo%i==0 && i!=1) {
return false;
}
else
return true;
}
}
答案 1 :(得分:1)
listOfPrimeNumbers
是一个局部变量。您可以将其更改为类的静态成员,使其成为实例变量并使isPrime
成为非静态成员,或将其作为参数传递给isPrime
。
鉴于这个类的明显意图,我将isPrime
设为非静态,并使listOfPrimeNumbers
为实例变量。
答案 2 :(得分:1)
你需要重新考虑你的课程如何组合在一起:
在构造函数中完成所有工作通常不是一个好主意。 Java中的构造函数很棘手,通常我会尽量使它们变得简单,并将实际工作转移到其他地方。
静态方法被高估了,我尽量避免它们。如果你有一些数据结构,你希望你的方法访问,使这些方法实例方法,并使数据结构成为实例变量。 Java应该是一种面向对象的语言,使用静态方法可以防止面向对象并限制你的选择。
考虑如何使用该类,以及如何测试它,并更改类实现的API以匹配该类。
答案 3 :(得分:0)
似乎您想将arraylist设置为类成员变量。但是,您将isPrime声明为静态。这两件事在一起没有意义。如果isPrime不需要是静态的,那么只需将arraylist存储为类成员。如果它需要是静态的(无论出于何种原因),你将不需要一个构造函数(因为在这种情况下isPrime是静态的没有意义)并在其他地方创建arraylist并将其作为参数传递to isPrime。
编辑:第二个想法,你不需要isPrime是静态的,它应该是这样的:
public class Primes {
ArrayList<Integer> listOfPrimeNumbers;
public Primes( int initialCapacity) {
listOfPrimeNumbers = new ArrayList<Integer>(initialCapacity);
//how do I get the above...
int index = 2;
while (index != listOfPrimeNumbers.size())
{
if (isPrime(index))
{
listOfPrimeNumbers.add(index);
}
index++;
}
}
public static boolean isPrime(int candidateNo) {
Iterator<Integer> iter = listOfPrimeNumbers.iterator( );
//in here ! ?
i=2;
while ( iter.hasNext( ) ) {
if (candidateNo%i==0 && i!=1) {
return false;
}
else
return true;
}
}
然而,您似乎还有其他问题。你的构造函数中的while循环将如何结束?您每次都会增加索引,但是如果它是素数,那么您只是在列表中添加一些内容。
在你的isPrime方法中,你的while循环有什么意义?你调用iter.hasNext(),但不要使用迭代的东西。您只需查看candidateNo
和i
。