使用“Generating all permutations of a given string”作为引用,我试图让我的程序(在检测到名称字段时)将名称的所有组合写入数据库(queryID aka qid 不是主键。我打算因为这一切都是重复的)。
示例:John Michael Doe
为了让您更好地了解场景,当有人使用我的程序进行搜索时,他们可以添加“约束”。
因此,当他们添加约束时,他们有一个下拉菜单,他们可以选择多个类别,其中一个是名称。
所以如果他们输入:
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 的输入未知时如何执行此操作的算法? (约束的数量和名称的长度,即名字中间名姓氏第二个姓氏)
如果有什么需要澄清或者我需要输入更多我的代码,请告诉我。
我修改了代码的底部,它现在将每个名称分开(而不是组合成一个),同时仍保留其他字段。
之前的输出:
插入 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/
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][
我有这样的哈希trial_hash={"key1"=>1000,"key2"=>34,"key3"=>500,"key4"=>500,"key5"=>500,"key6"=>500}我按值降序排列:my_hash=trial_hash.sort_by{|k,v|v}.reverse我现在是这样理解的:[["key1",1000],["key4",500],["key5",500],["key6",500],["key3",500],["key2",34]]但我希望当值相同时按键的升序排序。我该怎么做?例如:上面的散列将以这种方式排序:[["key1",1000],["key3",500
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www