gpt4 book ai didi

java - 生成名称排列并生成数据库

转载 作者:可可西里 更新时间:2023-11-01 07:44:01 26 4
gpt4 key购买 nike

使用“Generating all permutations of a given string”作为引用,我试图让我的程序(在检测到名称字段时)将名称的所有组合写入数据库(queryID aka qid 不是主键。我打算因为这一切都是重复的)。

示例:John Michael Doe

  1. 约翰·迈克尔·多伊
  2. 李四迈克尔
  3. Michael John Doe
  4. 迈克尔·多·约翰
  5. 约翰·迈克尔
  6. 母鹿迈克尔约翰

为了让您更好地了解场景,当有人使用我的程序进行搜索时,他们可以添加“约束”。

Initial

因此,当他们添加约束时,他们有一个下拉菜单,他们可以选择多个类别,其中一个是名称。

After adding constraint

所以如果他们输入:
Name CONTAINS foo bar 作为第一个约束。
Id CONTAINS 1234 第二个约束。
Name CONTAINS john doe 作为最后一个约束。

它将创建 SQL 语句:
插入 qal.query_input values('df084b1f-1337','1234','','','foo bar john doe','','');
(空格是没有搜索的类别)

现在我的问题是我想要这个输出(使用相同的搜索):

insert into qal.query_input values('df084b1f-1337','1234','','','foo bar','','');
插入 qal.query_input values('df084b1f-1337','1234','','','bar foo','','');
插入 qal.query_input values('df084b1f-1337','1234','','','john doe','','');
插入 qal.query_input values('df084b1f-1337','1234','','','doe john','','');

目前这是我的代码:

ArrayList<String> fields = constraintToInputLogFieldMap.get(key);
ArrayList<String> names;
for (String field : fields) {
ArrayList<String> values = inputLogFieldValues.get(field);

if (values == null) {
values = new ArrayList<>();
inputLogFieldValues.put(field, values);
}

// only retrieve singletonRange and listRange
if (singletonRange != null) {
values.add((String) singletonRange.getValue());
}
if (listRange != null) {
for (Object v : listRange.getValues()) {
values.add((String) v);
}
}
}
// This creates an arrayList for each name
// ie. [foo bar, john doe]
names = inputLogFieldValues.get("Name");

for (String field : inputLogFields) {
ArrayList<String> values = inputLogFieldValues.get(field);
if (values == null)
inputEntry += ",''";
else {
String valueStr = "";
for (String value : values)
valueStr += " " + value;
inputEntry += ",'" + valueStr.substring(1) + "'";
}
}
inputEntry = "insert into qal.query_input values('" + qid + "'" + inputEntry + ");";
logger.info("Stackoverflow SQL output: " + inputEntry);
dbUpdate(inputEntry);

现在我的问题是当 arraylist 的输入未知时如何执行此操作的算法? (约束的数量和名称的长度,即名字中间名姓氏第二个姓氏)

如果有什么需要澄清或者我需要输入更多我的代码,请告诉我。

更新 2/10/2016 17:36EST

我修改了代码的底部,它现在将每个名称分开(而不是组合成一个),同时仍保留其他字段。

之前的输出:
插入 qal.query_input values('df084b1f-1337','1234','','','foo bar john doe','','');
带更新的输出:
插入 qal.query_input values('df084b1f-1337','1234','','','foo bar','','');
插入 qal.query_input values('df084b1f-1337','1234','','','john doe','','');

更新的代码(如此简单的更改):

ArrayList<String> inputEntries = new ArrayList<>();
for (String name : names) {
inputEntry = "";
for (String field : inputLogFields) {
ArrayList<String> values = inputLogFieldValues.get(field);
if (values == null)
inputEntry += ",''";
else {
if (field.equals("Name")) {
inputEntry += ",'" + name + "'";
} else {
String valueStr = "";
for (String value : values)
valueStr += " " + value;
inputEntry += ",'" + valueStr.substring(1) + "'";
}
}
}
inputEntry = "insert into qal.query_input values('" + qid + "'" + inputEntry + ");";
inputEntries.add(inputEntry);
}
for (String sqlEntry : inputEntries) {
dbUpdate(sqlEntry);
}

现在我唯一需要解决的问题是生成名称排列的方法。

最佳答案

使用“Generating all possible permutations of a list recursively”作为引用,我添加/更改了这个小部分。

ArrayList<String> inputEntries = new ArrayList<>();
ArrayList<String> permutedNames = names; // <----
for (String name : permutedNames) { // <--- Now permutedNames
inputEntry = "";
for (String field : inputLogFields) { ...

并添加了以下功能:

private ArrayList<String> splitNames(ArrayList<String> listOfNames) {
String temp = "";
List<String> splitName;
List<List<String>> listSplitName = new ArrayList<List<String>>();
ArrayList<String> toReturn = new ArrayList<String>();

if (listOfNames.size() == 1) {
temp = listOfNames.get(0);
splitName = new ArrayList<String>(Arrays.asList(temp.split(" ")));
listSplitName = generatePerm(splitName);
for (int i = 0; i < listSplitName.size(); i++) {
toReturn.add(listSplitName.get(i).toString());
}
return toReturn;
}
else {
for (int i = 0; i < listOfNames.size(); i++) {
temp = listOfNames.get(i);
splitName = new ArrayList<String>(Arrays.asList(temp.split(" ")));
listSplitName = generatePerm(splitName);
for (int j = 0; j < listSplitName.size(); j++) {
toReturn.add(listSplitName.get(j).toString());
}
}
return toReturn;
}
}

private List<List<String>> generatePerm(List<String> original) {
if (original.size() == 0) {
List<List<String>> result = new ArrayList<List<String>>();
result.add(new ArrayList<String>());
return result;
}
String firstElement = original.remove(0);
List<List<String>> returnValue = new ArrayList<List<String>>();
List<List<String>> permutations = generatePerm(original);
for (List<String> smallerPermutated : permutations) {
for (int index=0; index <= smallerPermutated.size(); index++) {
List<String> temp = new ArrayList<String>(smallerPermutated);
temp.add(index, firstElement);
returnValue.add(temp);
}
}
return returnValue;
}

splitNames 函数获取一个名称列表并将每个名称拆分为一个单独的数组,其中仅包含名称。

例子:
输入 - [John Doe, Foo Bar Bat]输出 - [John, Doe] 被发送到 generatePerm 并且 [Foo, Bar, Bat] 被发送到 generatePerm

然后 generatePerm 将排列每个组合并发回组合列表。

然后将其发送回 splitNames,它将把排列编译成 ArrayList 并将其返回。

关于java - 生成名称排列并生成数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35324798/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com