java – 生成名称排列和数据库
使用“
Generating all permutations of a given string”作为参考,我试图让我的程序(在检测到名称字段时)向数据库写入名称的所有组合(queryID aka qid不是主键.我打算将它全部用于重复).
例如:John Michael Doe > John Michael Doe 为了让您更好地了解该场景,当有人使用我的程序进行搜索时,他们可以添加“约束”. 因此,当他们添加约束时,他们有一个下拉菜单,他们可以选择多个类别,其中一个是名称. 所以,如果他们输入: 它将创建SQL语句: 现在我的问题是我希望这个输出(使用相同的搜索): 插入qal.query_input值(‘df084b1f-1337′,’foo bar’,”); 目前这是我的代码: 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的输入未知时如何执行此操作的算法? (约束的数量和名称的长度,即.namename middlename lastname secondlastname) 如果有什么需要澄清或者我需要输入更多我的代码,请告诉我. 更新2016年10月2日17:36 我修改了代码的底部,现在它将每个名称分开(而不是组合成一个),同时仍然保留其他字段. 输出之前: 更新的代码(这么简单的更改): 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函数获取一个名称列表,并将每个名称分成一个只包含名称的单独数组. 例: 然后generatePerm将置换每个并发回一个组合列表. 然后将其发送回splitNames,它将排列编译成ArrayList并将其返回. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |