在排列程序中获取空指针异常以及一些其他问题? (JAVA)

时间:2014-11-24 05:43:38

标签: java permutation

这是我的代码。我敢肯定我只是在这里犯了一个粗心的错误,但是我拖延了,我在半夜这样做,所以我有点脑死神。我正在尝试创建一个生成列表排列的对象。我的老师基本上告诉我们每种方法应该做什么,所以我试着准确翻译他说的话。当我尝试使用main函数测试它时,我在第21,22和35行得到一个空指针异常。 这些是给出的指示。

  • (基本情况>如果我是列表长度为0的Permutations对象,则不执行任何操作,除非注意在调用hasNext()时应始终返回false。
  • (递归案例)从列表中删除并记住第一个元素(c)。
  • 使用剩余列表创建并记住新的Permutations对象(P)。
  • 从这个新对象中获取并记住第一个排列(L),如果没有,则为空列表(因为它的大小为0)。
  • 将索引计数器(i)初始化为0。 每次在Permutations对象上调用next()方法时,它都应该执行以下操作:
  • 返回L的副本,其中c插入位置i。增量i。
  • 一旦我变得太大,将L设置为P.next()并将i重置为0.
  • 如果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);
}

1 个答案:

答案 0 :(得分:0)

在构造函数中,您忽略了在L时初始化list.size() == 0

if(list.size() == 0)
{
    hasNext = false;
}

应该是

if(list.size() == 0)
{
    hasNext = false;
    L = new ArrayList<E>();
}