我试图在泛型函数中生成给定列表的所有可能的排列。我想我的功能代码是正确的。但是,在测试期间,我不断从主程序中收到编译器错误。请帮忙!
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);
答案 0 :(得分:1)
错误消息根本没有用;真正的问题是您正在调用属于对象的方法,但不提供对象。如果不是泛型,你会得到着名的“无法从静态上下文调用非静态方法”错误。
解决这个问题的一种方法是创建一个对象:
perms<Integer> computation = new perms<Integer>();
List<List<Integer>> resultantList = computation.generatePerm(p);
答案 1 :(得分:1)
generatePerm
函数不是static
:因为main
是static
,您不会从non-static
上下文调用static
函数<E>
声明的访问修饰符之后添加generatePerm
,以指定此函数是通用的。 generatePerm
函数的工作版本是:
public static <E>List<List<E>> generatePerm(List<E> original) {
//your code block
}
答案 2 :(得分:0)
你忘记了两件事:
generatePerm()
static
generatePerm()
通用添加<E>
Perms
结果:
public class Perms
...
public static <E> List<List<E>> generatePerm(List<E> original)
...
顺便说一下,您不必在类定义中声明<E>
,因为这里只在静态上下文中使用它。