列表java的排列

时间:2013-12-06 20:14:10

标签: java permutation generic-programming

我试图在泛型函数中生成给定列表的所有可能的排列。我想我的功能代码是正确的。但是,在测试期间,我不断从主程序中收到编译器错误。请帮忙!

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);

3 个答案:

答案 0 :(得分:1)

错误消息根本没有用;真正的问题是您正在调用属于对象的方法,但不提供对象。如果不是泛型,你会得到着名的“无法从静态上下文调用非静态方法”错误。

解决这个问题的一种方法是创建一个对象:

  perms<Integer> computation = new perms<Integer>();
  List<List<Integer>> resultantList = computation.generatePerm(p);

答案 1 :(得分:1)

  1. 您的generatePerm函数不是static:因为mainstatic,您不会从non-static上下文调用static函数
  2. 您应该在<E>声明的访问修饰符之后添加generatePerm,以指定此函数是通用的。
  3. generatePerm函数的工作版本是:

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

答案 2 :(得分:0)

你忘记了两件事:

  • 制作generatePerm() static
  • 然后您必须generatePerm()通用添加<E>
  • (java约定)类名以大写字母开头 - 将类重命名为Perms

结果:

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

顺便说一下,您不必在类定义中声明<E>,因为这里只在静态上下文中使用它。