从String数组中获取所有可能的名称组合?

时间:2014-11-19 18:45:17

标签: java arrays loops

我有一些代码,它采用一串已经用句点(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

等等。

我很沮丧如何做到这一点。算法不是我的强项。

2 个答案:

答案 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
相关问题