2014-09-03 114 views
0

我有下面的递归方法为给定的字符串生成排列。我试图为arraylist中的生成的字符串创建返回类型,更具体地说,我试图打印输出到jsp页面中。创建一个递归方法的返回类型

public static void permutation(String str) { 
     permutation("", str); 
} 

private static void permutation(String prefix, String str) { 
    int n = str.length(); 
    if (n == 0) System.out.println(prefix); 
    else { 
      for (int i = 0; i < n; i++) 
     permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+ n)); 
     } 
} 
+0

我真的很难弄清楚“创建返回类型”的含义。 – 2014-09-03 03:26:12

+0

@ChrisMartin他意味着他想从'permutation'返回一些东西,而不是仅仅返回'void'。但是,我仍然不确定究竟应该如何。 – Jashaszun 2014-09-03 03:39:56

+0

你想有一个返回类型在稍后在一个servlet中使用,比如把这些结果字符串放入对象的arraylist中。例如 – user1712095 2014-09-03 03:52:05

回答

0

您可以使用一个静态列表 “收” 的结果:

static List<String> perms = new ArrayList<>(); 

public static void main(String[] args) throws IOException { 
    permutation("abc"); 
    System.out.println(Arrays.toString(perms.toArray())); // prints [abc, acb, bac, bca, cab, cba] 
} 

public static void permutation(String str) { 
    permutation("", str); 
} 

private static void permutation(String prefix, String str) { 
    int n = str.length(); 
    if (n == 0) { 
     perms.add(prefix); 
    } 
    else { 
     for (int i = 0; i < n; i++) 
      permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1)); // you had a bug in the last index on this line 
    } 
} 

或者,您可以创建列表,并将它作为参数传递:

public static void main(String[] args) throws IOException { 
    List<String> perms = new ArrayList<>(); 
    permutation("abc", perms); 
    System.out.println(Arrays.toString(perms.toArray())); // print [abc, acb, bac, bca, cab, cba] 
} 

public static void permutation(String str, List<String> perms) { 
    permutation("", str, perms); 
} 

private static void permutation(String prefix, String str, List<String> perms) { 
    int n = str.length(); 
    if (n == 0) { 
     perms.add(prefix); 
    } 
    else { 
     for (int i = 0; i < n; i++) 
      permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1), perms); 
    } 
} 
+0

-1。使用全局变量构造/存储方法的返回值是一个非常糟糕的主意。 – JimN 2014-09-03 03:59:26

+1

@JimN首先,我提供了第二种方法(不使用静态成员)。其次,我提供第一种方法的原因是用最少的代码更改(方法签名等)来解决问题。第三,如果所有在这个类中完成的工作都是在一个无螺纹程序的一生中创建一次排列,那么在这种情况下使用静态字段将会非常好。 – alfasin 2014-09-03 04:08:05

1
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

public class Permute { 

    public static void main(String[] args) { 
     System.out.println(findAllPermutations("abc")); 
    } 

    public static List<String> findAllPermutations(String s) { 
     if (s == null) { 
      throw new NullPointerException(); 
     } 
     if (s.length() <= 1) { 
      return Arrays.asList(s); 
     } 

     List<String> permutations = new ArrayList<>(); 
     for (String permutation : findAllPermutations(s.substring(1))) { 
      char ch = s.charAt(0); 
      for (int i = 0; i <= permutation.length(); i++) { 
       String prefix = permutation.substring(0, i); 
       String suffix = permutation.substring(i); 
       permutations.add(prefix + ch + suffix); 
      } 
     } 
     return permutations; 
    } 
}