这是我的代码。我敢肯定我只是在这里犯了一个粗心的错误,但是我拖延了,我在半夜这样做,所以我有点脑死神。我正在尝试创建一个生成列表排列的对象。我的老师基本上告诉我们每种方法应该做什么,所以我试着准确翻译他说的话。当我尝试使用main函数测试它时,我在第21,22和35行得到一个空指针异常。 这些是给出的指示。
如果P没有下一个排列,那么这个对象也完成了。 hasNext()应该从这里开始返回false。
public class Permutations<E> //I know indentation is wrong here
{ // Couldn't get it to show as code unless it was like this
E c; // First Element
Permutations <E> P; // Are these the problem?
List <E> L; // ?
int i;
boolean hasNext = true
public Permutations(List<E> list)
{
if(list.size() == 0)
{
hasNext = false;
}
else
{
c = list.get(0);
list.remove(0);
P = new Permutations<E>(list); // Line 21
L = P.next(); // Line 22
i = 0;
}
}
public boolean hasNext()
{
if(hasNext == false) return false;
else return true;
}
public List<E> next()
{
if(hasNext())
{
L.add(i, c); // Line 35
ArrayList<E> newList = new ArrayList<E>();
for(int k=0; k<L.size(); k++)
{
newList.add(k, L.get(k));
}
i++;
if(i >= L.size())
{
L = P.next();
i = 0;
}
System.out.println(newList);
return newList;
}
else
{
return L;
}
}
}
我意识到hasNext方法看起来真的很多余,但我们应该把它放在那里。此外,它说当在对象中调用下一个方法时,它应该返回列表的新副本,然后执行其他所有操作,但我对此感到困惑,因为如果它首先返回,那么方法的其他部分如何?应该到达? 提前谢谢。
编辑:此外,这是我尝试使用的主要测试:
public static void main(String[] args)
{
List<Integer> myList = new ArrayList<Integer>();
myList.add(1);
myList.add(2);
myList.add(3);
Permutations<Integer> perm = new Permutations<Integer>(myList);
}
答案 0 :(得分:0)
在构造函数中,您忽略了在L
时初始化list.size() == 0
:
if(list.size() == 0)
{
hasNext = false;
}
应该是
if(list.size() == 0)
{
hasNext = false;
L = new ArrayList<E>();
}