我有一些代码,它采用一串已经用句点(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”,选择可能是:
von.del
von.smith
von.john
von.james
von.del.smith
von.smith.john
von.smith.james
等等。
我很沮丧如何做到这一点。算法不是我的强项。
答案 0 :(得分:3)
这个问题可以通过递归来解决。一种可能的实现方式如下:
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], "");
}
}
答案 1 :(得分:0)
您可以尝试这种替代的非递归方法(而不是递归是坏的)。不确定它是否是正确的输出,但可能会给你一些想法。
public class CombineNames {
public static void main(String[] args) {
combine("von.del.smith.john.james");
}
private static void combine(String nameStr) {
String[] tokens = nameStr.split("\\.");
for (int i = 0; i < tokens.length; i++) {
String parts="";
for (int j = i + 1; j < tokens.length; j++) {
parts+="."+tokens[j];
System.out.println(tokens[i] + parts);
}
}
}
}
输出:
von.del
von.del.smith
von.del.smith.john
von.del.smith.john.james
del.smith
del.smith.john
del.smith.john.james
smith.john
smith.john.james
john.james