请大家仔细看看一下要求再帮个大忙、、、如果没做出来请帮忙介绍下其他解决方案业务涉及:
名字的拼音处理组合主要考虑多音字。。通过名字返回全名的拼音组合。。组合算法:
已知条件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:确定个不确定长度的数组
以下是条件产生代码。。eachArrays就是已知的数组length就是个数。。
for (int i = 0; i < eachs.length;i++) {
String[] eachArrays = PinyinHelper.toHanyuPinyinStringArray(eachs[i], format);
已知条件2:从第一个数组开始按要求条件组合赋值。
要求条件:
打个比方:如果有3个数组。。第一个有2个,第二个有3个,第三个有1个。用这三个数组组成多个长度为3的数组。。要求每个数组第一个数存储第一个数组里的对应的值。。按此遍历第二个数存第二个。。其他同理。。注意事项:已知条件都是动态产生的、。。
条件一中确定个是通过循环计算产生的。。不是已存在的请专家帮着弄弄。。好像必须得递归。。不过我抽象不出递归条件。。给个范例吧。。最好解答一下。。只要弄出来
解决方案 »
- struts2文件上传怪异问题
- displaytag 中文分页问题(在线求解)
- Let me do a favor(请让我来帮你)
- 软件帝国版图(独欠中国) 附件
- ofbiz学习求助
- jFree图片无法显示的问题(求大神帮忙啊~)
- 我换了N种操作系统了,为什么Tomcat装好后启动不起来?
- 急用!!!response.sendRedirect和使用<jsp:forward>标签有什么不同
- 学习struts需要一个什么样的基础?
- 100分算了,急!急!急!为什么我的这句sql,执行不成功?很奇怪,大加帮忙
- Spring 的 JDBCTemplate 使用preparedStatement操作SqlServer数据库的问题
- 大写们来看哈吧!!servlet跳转路径问题!!!
这好像也是一个排列组合的计算吧,我按我的理解重新叙述一下你的需求吧:第一步:先将汉字转成拼音,由于汉字通常都是多音字,因此,每个汉字对应一个数组,存放这个汉字的几个读音的拼音,
比如:赵更行,生成:
{"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;
}
}
不用递归,个人觉得还是小小有些得意的。