2014-11-24 2 views
0

Это мой код. Я уверен, что я просто делаю неосторожную ошибку здесь, но я откладывал, и я делаю это среди ночи, так что я немного испорчен. Я пытаюсь создать объект, который генерирует перестановки в списке. Мой учитель в основном сказал нам, что каждый метод должен делать, я пытался перевести именно то, что он сказал. Однако, когда я пытаюсь проверить его с помощью основной функции, я получаю исключение с нулевым указателем в строках 21, 22 и 35. Это инструкции.Получение исключения null указателя наряду с несколькими другими проблемами в программе перестановок? (Java)

  • (Базовый вариант> Если я объект Перестановки длины списка 0, не делать ничего, кроме отметить, что я всегда должен возвращать ложь, когда hasNext() называется.
  • (Рекурсивный случай) Удалить и запомнить первый элемент (c) из списка.
  • Создайте и запомните новый объект Permutations (P) с оставшимся списком.
  • Получите и запомните первую перестановку (L) от этого нового объекта или пустой список, если он не имеет значения (потому что это размер 0).
  • Инициализировать индексный счетчик (i) до 0. Каждый раз, когда метод next() вызывается в объекте Permutations, он должен делать следующее:
  • Верните копию 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 действительно кажется излишним, но мы должны иметь его там. Кроме того, он говорит, что когда в объекте вызывается следующий метод, он должен возвращать новую копию списка, а затем делать все остальное, но я смущен этим, потому что, если он возвращается первым, как другие части метода должен быть достигнут? Спасибо заранее.

Edit: Кроме того, это главный тест, который я пытался использовать:

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

В конструкторе, вы пренебрегаете инициализировать L когда list.size() == 0:

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

должен быть

if(list.size() == 0) 
{ 
    hasNext = false; 
    L = new ArrayList<E>(); 
} 
Смежные вопросы