题目原题:任意数字序列“12345678”之类,输出它们所有的排列组合
这道题目对于学习递归还是挺不错的,可以借鉴一下
代码如下:
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
public class Test {
//待排列的字符串。
static String toBeArranged ="12345678";
//将其转换成字符数组。
static String[] array =stringToStringArray(toBeArranged);
//字符串长度。
static int length=array.length;
//存放数组时计数。
static int k=0;
//result是存储计算结果的数组,其大小为length的阶乘。
static String[] result=new String[total(length)];
//主函数,调用方法并输出结果
public static void main(String[] args)
{
//调用主要方法
listAll(Arrays.asList(array), "");
//输出
System.out.println(Arrays.toString(result));
}
//主要的计算方法。
public static void listAll(List candidate, String prefix)
{
if(prefix.length()==length) //小于字符串长度的组合忽略。
{
result[k++]=prefix; //存放数组里。
}
for(int i=0;i<candidate.size();i++)
{
List tmp = new LinkedList(candidate);
{
listAll(tmp, prefix + tmp.remove(i)); //函数中的参数从右边开始解析
}
}
}
//将字符串转成数组。
static String[] stringToStringArray(String s)
{
int length=s.length();
if(length<=0)
{
return new String[0];
}
String[] result=new String[length];
for(int i=0;i<length;i++)
{
result[i]=""+s.charAt(i);
}
return result;
}
//计算number阶乘,为结果数组的容量。
static int total(int number)
{
int number1=1;
for(int i=1;i<=number;i++)
{
number1*=i;
}
return number1;
}
}
注意的几点:
public Object remove()
作用是移除LinkedList对象的第一个元素..
返回的是被移除的那个元素.
public Object remove(int index);
作用是移除LinkedList对象中索引号为index的元素..
返回的是被移除的那个元素.
public boolean remove(Object o)
作用是移除LinkedList对象中值为o的元素..
移除成功返回true,否则返回false
也就是说在代码中的tmp.remove(i)),其用意是删除tem[i]的同时并获取到它的值
且因为list是有顺序的,所以在删除对象之后,排在其后的对象下标都减1,保持了序列的连贯。
除了主方法逻辑比较难理解一点,其余的代码应该都不难。