又来了
- /*
- 需求:输出任意字符串的全组合情况如:
- 输入"abc"
- 输出结果为:
- "a" "b" "c"
- "ab" "ac" "bc" "ba" "ca" "cb"
- "abc" "acb" "bca" "bac" "cab" "cba"
- */
- import java.util.Scanner;
- import java.util.ArrayList;
- import java.util.ListIterator;
- class Demo
- {
- public static void main(String[] args)
- {
- System.out.println("输入你要排列的字符串:");
- //创建Scnnner扫描器对象 获取控制台输入
- Scanner sc = new Scanner(System.in);
- //等待输入
- String str = sc.nextLine();
- //把字符串转换成字符数组
- char[] chr = str.toCharArray();
- int len = chr.length;
- //创建一个Arraylist对像 用于存储各种组合情况
- ArrayList<String> al = new ArrayList<String>();
-
- //返回一个ArrayList集合引用 该集合中存储了字符串各种组合情况 用newal来接受这个引用
- ArrayList<String> newal = getGroups(al,chr,len);
-
- //增强for遍历集合 和 打印所有情况
- for(String s : newal)
- {
- System.out.println(s);
- }
- System.out.println("一共有:"+newal.size()+"个组合");
- }
- /*
- 这个函数的作用是将所有的组合情况存入ArrayList集合中
- 其中用到了递归 判断是否结束条件是n==1
- */
- public static ArrayList<String> getGroups(ArrayList<String> al,char[] chr,int n)
- {
- if(n==1)
- {
- for(int x=0; x<chr.length ;x++)
- {
- al.add(chr[x]+"");
- }
- }
- else
- {
- al = getGroups(al,chr,n-1);
- for(int x=0; x<chr.length; x++)
- {
- ListIterator<String> it = al.listIterator();
- while(it.hasNext())
- {
- String s = it.next();
- String newstr = chr[x]+""+s;
- /*
- 这里的if是判断字符是否重复和字符串是否重复
- 提示:其实可以用TreeSet来代替ArrayList集合 那么newstr.length()==n 这句就可以不要了
- 因为TreeSet元素不可以重复
-
- 我建议用TreeSet集合 同时可以自定义比较器 排列元素
- 我的这段代码可能导致输出无序 所以还是用TreeSet吧
- 楼主自己改吧 看到币还没送出 所以就写了 希望把币给我 缺技术分啊~~
- */
- if((!s.contains(chr[x]+""))&&(newstr.length()==n))
- it.add(newstr);
- }
- }
- }
- return al;
- }
- }
复制代码 |