2013-12-06 2 views
0

Я пытаюсь сгенерировать все возможные перестановки заданного списка в общей функции. Я думаю, что у меня правильный код функции. Однако во время тестирования я продолжаю получать ошибки компилятора из своей основной программы. Пожалуйста помоги!перестановки в списке java

import java.util.*; 

class perms <E>{ 

    public List<List<E>> generatePerm(List<E> original) { 
     if (original.size() == 0) { 
      List<List<E>> result = new ArrayList<List<E>>(); 
      result.add(new ArrayList<E>()); 
      return result; 
     } 

     E firstElement = original.remove(0); 
     List<List<E>> returnValue = new ArrayList<List<E>>(); 
     List<List<E>> permutations = generatePerm(original); 

     for (List<E> smallerPermutated : permutations) { 
      for (int index=0; index <= smallerPermutated.size(); index++) { 
       List<E> temp = new ArrayList<E>(smallerPermutated); 
       temp.add(index, firstElement); 
       returnValue.add(temp); 
      } 
     } 

     return returnValue; 
    } 

    public static void main(String[] params){ 
     List<Integer> p = new ArrayList<Integer>(); 
     p.add(1); 
     p.add(2); 

     System.out.print(p.toString()); 

     List<List<Integer>> resultantList=generatePerm(p); 

     System.out.print(resultantList.toString()); 
    } 
} 

Я постоянно генерируя следующую ошибку в моей испытательной части:

perms.java:33: generatePerm(java.util.List<E>) in perms<E> cannot be applied to (java.util.List<java.lang.Integer>) 
List<List<Integer>> resultantList=generatePerm(p); 

ответ

1

Сообщение об ошибке не помогает вообще; реальная проблема заключается в том, что вы вызываете метод, принадлежащий объекту, но не предоставляете объект. Если бы не дженерики, вы получили бы известную ошибку «не может вызвать нестатический метод из статического контекста».

Один из способов исправить это создает объект:

perms<Integer> computation = new perms<Integer>(); 
    List<List<Integer>> resultantList = computation.generatePerm(p); 
1
  1. Ваша generatePerm функция не static: а main это static не будет вызывать non-static функцию из static контекста.
  2. Вы должны поместить <E> после модификатора доступа объявления generatePerm, чтобы указать, что эта функция является общей.

Так рабочая версия generatePerm функции будет:

public static <E>List<List<E>> generatePerm(List<E> original) { 
    //your code block 

} 
0

Вы забыли 2 вещи:

  • сделать generatePerm()static
  • , то вы должны сделать generatePerm() родовое добавления <E>
  • (java convention) имена классов начинаются с заглавной буквы - переименовать класс Perms

Результат:

public class Perms 
... 
public static <E> List<List<E>> generatePerm(List<E> original) 
... 

Btw вы не должны объявить <E> в определении класса, потому что здесь вы использовать его только в статическом контексте.

Смежные вопросы