高分求解String[m][n]的顺序组合问题

yajiu99 2006-05-16 06:06:16
我要把用户输入的姓名换为拼音,由于存在多音字,所以比较麻烦,

举个例子:每个字的拼音作为一个数组,例如“重”的拼音为[chong,zhong],那么“仇重”的拼音实际上是个2维数组[[qiu,chou],[chong,zhong]], 现在要把拼音组合,实际上就有4种qiuchong,qiuzhong,chouchong,chouzhong,最后需要的结果就是把这4种组合使用分隔符连成字符串

例如qiuchong#qiuzhong#chouchong#chouzhong,

而实际上用户输入的字数是不定的,这我可以得到,每个字的拼音数组长度也是不定的,也可以得到,问题就是如何生成最后要的字符串,问题的实质就是2维字符数组string[m][n]组合出一个字符串,也可以说是多个1维数组

之所以这样组合,是为了便于按拼音查询查询,无论是qiuchong还是chouzhong都能查到“仇重”,而且可以仅用like就行了

首先希望不要以为就是一个2重循环遍历的问题,遍历很容易,关键是组合,怎么样组合出来符合条件的结果
...全文
113 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yajiu99 2006-06-29
  • 打赏
  • 举报
回复
public class Combination {
public static void main(String[] args){
cLink group1 = new cLink(new String[] {"A","a"});
cLink group2 = new cLink(new String[] {"B","b","2"});
cLink group3 = new cLink(new String[] {"C","c","3","三"});
cLink[] groups = new cLink[]{group1,group2,group3};
String tmp="";
int k=groups.length-1;
while(k>0){
for(int i=0;i<groups.length ;i++){
System.out.print(groups[i].getCurValue()+""+"/");
}
System.out.println("");
while(true){
if(groups[k].move()==0){ //移动某个链表的指针,如果越过尾部,就移动前一个链表的指针,循环下去
k--;
if(k<0)break; //如果第一个链表的指针都越过了尾部,就可以结束程序了
}else{
k=groups.length-1; //如果没有越过尾部,就把k置为最后一个链表
break;
}
}
}
}
}

//以数组为基础,构造一个简单的循环链表
class cLink {
private String[] array = null;
private int p = 0; //p是数组的循环指针
public cLink(String[] args) {
array = args;
p = 0;
}

public String getCurValue() {
return array[p];
}

public int move() { //指针每次移动一位,如果抵达数组尾,就回到数组头
p++;
return p == array.length ? (p = 0) : p;
}
}
yonghar 2006-05-16
  • 打赏
  • 举报
回复
上面的贴错了。重新贴一下:


//以“参观”为例

//字数为2,建立一个数量为2的数组
Object[] allSpell = new Object[2];

//第一个字的拼音
String[] spell1 = new String[] { "cān", "cēn", "sān", "shēn" };
allSpell[0] = spell1;

//第二个字的拼音
String[] spell2 = new String[] { "guān", "guàn" };
allSpell[1] = spell2;

//...多个字以此类推

//生成拼音组合
StringBuffer allSpellStrBF = new StringBuffer();
int size = allSpell.length > 0 ? 1 : 0;
for (int i = 0; i < allSpell.length; i++) {
String[] spellCell = (String[]) allSpell[i];
size *= spellCell.length;
}
int progress = 0;
int[] arrayStep = new int[allSpell.length];
while (progress < size) {
progress++;

String spellStr = "";
for (int i = 0; i < allSpell.length; i++) {
spellStr += ((String[]) allSpell[i])[arrayStep[i]];
arrayStep[i] = (++arrayStep[i])
% ((String[]) allSpell[i]).length;
}
if (progress < size) {
spellStr += "#";
}
allSpellStrBF.append(spellStr);
}

String allSpellStr = allSpellStrBF.toString();
System.out.println(allSpellStr);
yonghar 2006-05-16
  • 打赏
  • 举报
回复
//以“参观”为例

//字数为2,建立一个数量为2的数组
Object[] allSpell = new Object[2];

//第一个字的拼音
String[] spell1 = new String[] { "cān", "cēn", "sān", "shēn" };
allSpell[0] = spell1;

//第二个字的拼音
String[] spell2 = new String[] { "guān", "guàn" };
allSpell[1] = spell2;

//...多个字以此类推

//生成拼音组合
StringBuffer allSpellStrBF = new StringBuffer();
int size = allSpell.length > 0 ? 1 : 0;
for (int i = 0; i < allSpell.length; i++) {
String[] spellCell = (String[]) allSpell[i];
size *= spellCell.length;
}
int progress = 0;
int[] arrayStep = new int[allSpell.length];
while (progress < size) {
progress++;

String spellStr = "";
for (int i = 0; i < allSpell.length; i++) {
spellStr += ((String[]) allSpell[i])[arrayStep[i]];
arrayStep[i] = arrayStep[i]++ % ((String[]) allSpell[i]).length;
}
if (progress < size) {
spellStr += "#";
}
allSpellStrBF.append(spellStr);
}

String allSpellStr = allSpellStrBF.toString();
System.out.println(allSpellStr);

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧