黑马程序员技术交流社区

标题: 打印字符串所有组合,用shuffle还算简单 [打印本页]

作者: 逍遥小seng    时间: 2014-12-2 19:59
标题: 打印字符串所有组合,用shuffle还算简单
看到别人写的代码,感觉有些繁琐,自己写了个简单的。
主要用到了Collections中的shuffle,洗牌模式。供大家参考
需求:编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符
例如:
原始字符串是"abc",打印得到下列所有组合情况
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"
public class Test24 {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                TreeSet<String> ts = new TreeSet<String>();
                printAll("abc",ts);
                System.out.println(ts+"..."+ts.size());
        }
       
        public static void printAll(String name,TreeSet<String> ts)//没有直接打印,放进了集合中,排序了
        {
                if(name.length()==1)
                        ts.add(name);
                else
                {
                        ArrayList<String> al = new ArrayList<String>();
                        ArrayList<String> a2= new ArrayList<String>();
                        StringBuilder sb = new StringBuilder();
                        for(int x=0;x<name.length();x++)
                        {
                                al.add(name.charAt(x)+"");//先存入集合中,洗牌
                        }
                        while(true)//一直不停洗牌
                        {
                                sb.delete(0,sb.length());
                                Collections.shuffle(al);
                                for(String str:al)
                                {
                                        sb.append(str);
                                }
                                String s = sb.toString();
                                if(!a2.contains(s))//直到新集合不包含,再存,
                                        a2.add(s);
                                if(a2.size()==countNum(name.length()))//等存到数量就不再洗牌,数量=3!(abc),=4!(abcd),另外定了个方法
                                        break;
                                       
                        }//上面部分主要是打印一个字符串,长度不变 例如“abc”所有组合
                        //观察的:abc——ab  acb——ac,bca——bc等等,长度减少就是取字符串前面的部分(不带最后一个脚标)
                        //下面主要的到 ab ac bc,每个串的组合,每个都去递归就可以了
                        for(int x=0;x<a2.size();x++)
                        {
                                String s = a2.get(x);
                                ts.add(s);//a2集合已经为所得,只是再存入treeset中排序
                                String ss = s.substring(0,s.length()-1);//顺便减少每个串的最后一个字符如abc——ab
                                printAll(ss,ts);
                        }
                }
        }
        public static int countNum(int len)
        {
                if(len==1)
                        return 1;
                return len*countNum(len-1);
        }

}






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2