我有一些代码,它采用已经用句点 (nameStr) 分隔的名称字符串并将其分解为字符串数组:
public static String doc;
public static void buildNameChoices (String whichName, String nameStr)
{
String[] nameArray= nameStr.split("\\.", -1);
for(int i=0; i < (nameArray.length); i++){
nameArray[i]= nameArray[i]+".";
System.out.println(nameArray[i]);
}
第二部分将句点添加回每个数组元素中,因为它们将在输出中重新连接在一起。我试图用它来创建用户可以选择的所有可能的名称组合的列表。我们唯一不必担心的是较高的元素不能出现在较低的元素之前(例如,第二个元素不会出现在第一位,而第一个元素不会出现在第一位,等等)。换句话说,它将是“n”,然后是“n”之后的所有可能的组合。
所以,如果我有字符串“von.del.smith.john.james”,选择可能是:
冯.德尔
冯·史密斯
冯·约翰
冯·詹姆斯
冯·德尔·史密斯
冯.史密斯.约翰
冯·史密斯·詹姆斯
等等等等
我对如何做到这一点很困惑。算法不是我的强项。
最佳答案
这个问题可以用递归来解决。一种可能的实现如下所示:
public static void buildNameChoicesHelper(String[] nameArray, int nameIndex,
String str) {
if(nameIndex >= nameArray.length) {
if(str.length() > 0) {
System.out.println(str.substring(0, str.length() - 1));
}
}
else {
buildNameChoicesHelper(nameArray, nameIndex + 1, str);
buildNameChoicesHelper(nameArray, nameIndex + 1, str + nameArray[nameIndex] + ".");
}
}
public static void buildNameChoices(String nameStr) {
String[] nameArray = nameStr.split("\\.", -1);
buildNameChoicesHelper(nameArray, 0, "");
}
如果每个名字都必须是(名字,姓氏)组合,那么您可以尝试以下修改:
public static void buildNameChoicesHelper(String[] nameArray, int nameIndex,
String firstName, String lastName) {
if(nameIndex >= nameArray.length) {
if(lastName.length() > 0) {
System.out.println(firstName + lastName);
}
}
else {
buildNameChoicesHelper(nameArray, nameIndex + 1, firstName, lastName);
buildNameChoicesHelper(nameArray, nameIndex + 1, firstName, lastName + "." + nameArray[nameIndex]);
}
}
public static void buildNameChoices(String nameStr) {
String[] nameArray = nameStr.split("\\.", -1);
for(int i = 0; i < nameArray.length; i++) {
buildNameChoicesHelper(nameArray, i + 1, nameArray[i], "");
}
}
关于java - 从字符串数组中获取所有可能的名称组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27024540/