请大家仔细看看一下要求再帮个大忙、、、如果没做出来请帮忙介绍下其他解决方案业务涉及:
名字的拼音处理组合主要考虑多音字。。通过名字返回全名的拼音组合。。组合算法:
已知条件1:确定个不确定长度的数组
以下是条件产生代码。。eachArrays就是已知的数组length就是个数。。
for (int i = 0; i < eachs.length;i++) {
String[] eachArrays = PinyinHelper.toHanyuPinyinStringArray(eachs[i], format);
已知条件2:从第一个数组开始按要求条件组合赋值。
要求条件:
打个比方:如果有3个数组。。第一个有2个,第二个有3个,第三个有1个。用这三个数组组成多个长度为3的数组。。要求每个数组第一个数存储第一个数组里的对应的值。。按此遍历第二个数存第二个。。其他同理。。注意事项:已知条件都是动态产生的、。。
条件一中确定个是通过循环计算产生的。。不是已存在的请专家帮着弄弄。。好像必须得递归。。不过我抽象不出递归条件。。给个范例吧。。最好解答一下。。只要弄出来

解决方案 »

  1.   

    怎么感觉这几天就碰到类似的问题了,
    这好像也是一个排列组合的计算吧,我按我的理解重新叙述一下你的需求吧:第一步:先将汉字转成拼音,由于汉字通常都是多音字,因此,每个汉字对应一个数组,存放这个汉字的几个读音的拼音,
    比如:赵更行,生成:
    {"zhao"},{"geng","jing"},{"xing","hang"}第二步:组合这些拼音,形成多个方案,让用户选择自己到底是哪个读音,因此组合有:
    {"zhao","geng","xing"}
    {"zhao","jing","xing"}
    {"zhao","geng","hang"}
    {"zhao","jing","hang"}如果是这样,那么代码如下:
    import java.util.ArrayList;
    import java.util.List;
    /**
     * 算法基本思路:
     * 计算由N个数组成的排列,其中该排列中第i位的取值范围为0-M,其中0<=i<N 
     * 
     * @author jinxfei
     *
     */
    public class Test {
        
        public static void main(String[] args) throws Exception{ 
            //这里我使用三个固定的数组做例子,也就是我上面描述的数组
         //这些数组被依次放到一个list中,你实际使用时,只需要提供,
         //放多少都可以,我会在方法里自动适应
         String[] array1={"zhao"};
         String[] array2={"geng","jing"};
         String[] array3={"xing","hang"};
         ArrayList pinyinList=new ArrayList();
         pinyinList.add(array1);
         pinyinList.add(array2);
         pinyinList.add(array3);
        
         Test t=new Test();
         t.process(pinyinList);
        
        } 
        
        //循环算出所有合法的组合    
        private void process(List pinyin){
         int[] counter=buildCounter(pinyin);
         do{   
         String[] aResult=getCurComposite(counter,pinyin);
         //我只是将得到的每一个结果打印出来,你可以根据自己的需要做处理,比如,放到list中返回。    
         printResult(aResult);    
         }while(!incCounter(counter,pinyin));
        }
        
        //根据不定长的拼音数组,动态计算出一个计数器数组,该计数器初始化的时候所有位都是0,
        //然后由incCounter方法依次递增,一直到所有组合全部算出
        private int[] buildCounter(List pinyin){
         int[] counter=new int[pinyin.size()];
         for(int i=0; i<counter.length;i++){
         counter[i]=0;
         }
         return counter;
        }
        
        //打印一个合法组合
        private void printResult(String[] result){
         System.out.print("组合结果:");
         for(int i=0; i<result.length;i++){
         System.out.print(result[i]);
         if (i<result.length-1){
         System.out.print(",\t");
         }
         }
         System.out.println();
        }
        
        //使用计数器当前状态,从pinyin列表中取得一个组合
        private String[] getCurComposite(int[] counter,List pinyin){
            String[] result=new String[counter.length];
            for(int i=0; i<counter.length;i++){
             String[] pinyinArray=(String[])pinyin.get(i);
             result[i]=pinyinArray[counter[i]];
            }
            return result;
        }
        
        //将计数器递进(进位原则根据pinyin数组各位的长度动态确定
        //返回值表示该数组是否已经达到溢出条件(也就是所有可能性都算出来了,这时候程序就要退出了)
        private boolean incCounter(int[] counter,List pinyin){
            boolean overflow=true;
         for(int i=0;i<counter.length;i++){
             String[] pinyinArray=(String[])pinyin.get(i);
                if (counter[i]<pinyinArray.length-1){
                 counter[i]++;
                 overflow=false;
                    break;
                }else{
                 counter[i]=0;
                }
            }
         return overflow;
        }
        }
    不用递归,个人觉得还是小小有些得意的。