如何在 android 中的二维数组中搜索和替换
How to search and replace with in 2d array in android
我有 4 列的 sqlite 数据库。即 id 、规则 body、cons 和 bool。我可以向其中插入数据并使用游标检索并存储在二维数组中。示例行可以是
id rule body cons bool
1 jogging(?X) athelete(?x) 0
2 athelete(?X) runsfast(?x) 0
3 athelete(?X),runsfast(?x) champion(?x) 0
相同的是没有列标题的数组结构。现在我想做的是用户必须以下列格式输入
jogging(alan)
它必须替换 2darray 中的 ?x 并在 ?x 位置输入 alan。
1 jogging(alan) athelete(alan) 0
2 athelete(alan) runsfast(alan) 0
3 athelete(alan),runsfast(alan) champion(alan) 0
如果找到 jogging(alan),将 jogging(alan) 的缺点复制到 newarray[]。
newarray[athelete(alan)]
newarray[] 现在携带运动员 (alan)。现在 newarray[] 已经更新,所以再次搜索 athlete(alan),如果找到,将 runsfast(alan) 保存到 newarray[]。再次更新,newarray[].
中有 athelete(alan),runsfast(alan)
newarray[athelete(alan),runfast(alan)]
现在搜索 athelete(alan)、runsfast(alan) 并将 champion(alan) 添加到新数组[] 再次重复,这次没有找到匹配项,因此退出。
newarray[athelete(alan),runfast(alan),runfast(alan)]
有什么想法吗
使用 HashMap 存储具有唯一键的单行元素,并将映射存储在数组列表中。您可以循环检索每个映射并获取键的值。
我认为比在数组中保留对 sqlite 数据的引用更好的方法是使用游标加载器并在位置处使用游标,然后使用 2d 数组进行评分。游标是暂时的,可以关闭和丢弃。在适配器中使用交换游标更容易操作......等等。只是一个想法。
我编辑了完整的答案,因为您更新了问题以设置正确的示例。
使用 SQLite 来做,我会使用这样的东西:(未测试)
SELECT id, replace( rule body, '?X', alan ) AS 'rule_body', replace( cons, '?X', alan ) AS 'cons', bool
FROM table
WHERE rule_body LIKE athelete(alan)
OR cons LIKE athelete(alan);
这应该是 return 与您想要的名称相对应的正确行。您需要设置名称而不是输入中的文本(提取名称)
如果你真的想使用你的数组,你需要循环数组并检查第二和第三列(我想在两个字段上)。
String[][] array = new String[2][4]; //The result array
List<String> result = new ArrayList<String>();
String name = ""; //extract the name from the form input.
for(String[] tmp : array){
if(isValid(tmp, name)){ //a method to check the field 1 and 2 of tmp with name
result.add(tmp[2]) //the cons row
}
}
您只需创建 isValid(String[] row, String name) 来检查是否在正确的字段中找到了名称。使用正则表达式检查是否找到 '(' + name + ')' 就可以了。
一种方法是在你的情况下使用字符进行拆分 ( 这样它将拆分
慢跑(?X)进入慢跑和?x)你可以使用替换方法去除它)。类似地用慢跑(艾伦)做,所以它将是慢跑和艾伦)
将它们添加到 arraylist 或任何您可以轻松使用的存储结构。如果是数组,你可以搜索 if
rule[x] Matches fact[x]
copy fact[x+1] into rule[x+1]
所以如果它发现在一个数组中慢跑等于在另一个数组中慢跑,将下一项复制到另一个数组替换 ?x。
我猜你是在处理基于规则的号角子句,这就是你使用那种格式的原因?
我有 4 列的 sqlite 数据库。即 id 、规则 body、cons 和 bool。我可以向其中插入数据并使用游标检索并存储在二维数组中。示例行可以是
id rule body cons bool
1 jogging(?X) athelete(?x) 0
2 athelete(?X) runsfast(?x) 0
3 athelete(?X),runsfast(?x) champion(?x) 0
相同的是没有列标题的数组结构。现在我想做的是用户必须以下列格式输入
jogging(alan)
它必须替换 2darray 中的 ?x 并在 ?x 位置输入 alan。
1 jogging(alan) athelete(alan) 0
2 athelete(alan) runsfast(alan) 0
3 athelete(alan),runsfast(alan) champion(alan) 0
如果找到 jogging(alan),将 jogging(alan) 的缺点复制到 newarray[]。
newarray[athelete(alan)]
newarray[] 现在携带运动员 (alan)。现在 newarray[] 已经更新,所以再次搜索 athlete(alan),如果找到,将 runsfast(alan) 保存到 newarray[]。再次更新,newarray[].
中有 athelete(alan),runsfast(alan)newarray[athelete(alan),runfast(alan)]
现在搜索 athelete(alan)、runsfast(alan) 并将 champion(alan) 添加到新数组[] 再次重复,这次没有找到匹配项,因此退出。
newarray[athelete(alan),runfast(alan),runfast(alan)]
有什么想法吗
使用 HashMap 存储具有唯一键的单行元素,并将映射存储在数组列表中。您可以循环检索每个映射并获取键的值。
我认为比在数组中保留对 sqlite 数据的引用更好的方法是使用游标加载器并在位置处使用游标,然后使用 2d 数组进行评分。游标是暂时的,可以关闭和丢弃。在适配器中使用交换游标更容易操作......等等。只是一个想法。
我编辑了完整的答案,因为您更新了问题以设置正确的示例。
使用 SQLite 来做,我会使用这样的东西:(未测试)
SELECT id, replace( rule body, '?X', alan ) AS 'rule_body', replace( cons, '?X', alan ) AS 'cons', bool
FROM table
WHERE rule_body LIKE athelete(alan)
OR cons LIKE athelete(alan);
这应该是 return 与您想要的名称相对应的正确行。您需要设置名称而不是输入中的文本(提取名称)
如果你真的想使用你的数组,你需要循环数组并检查第二和第三列(我想在两个字段上)。
String[][] array = new String[2][4]; //The result array
List<String> result = new ArrayList<String>();
String name = ""; //extract the name from the form input.
for(String[] tmp : array){
if(isValid(tmp, name)){ //a method to check the field 1 and 2 of tmp with name
result.add(tmp[2]) //the cons row
}
}
您只需创建 isValid(String[] row, String name) 来检查是否在正确的字段中找到了名称。使用正则表达式检查是否找到 '(' + name + ')' 就可以了。
一种方法是在你的情况下使用字符进行拆分 ( 这样它将拆分 慢跑(?X)进入慢跑和?x)你可以使用替换方法去除它)。类似地用慢跑(艾伦)做,所以它将是慢跑和艾伦) 将它们添加到 arraylist 或任何您可以轻松使用的存储结构。如果是数组,你可以搜索 if
rule[x] Matches fact[x]
copy fact[x+1] into rule[x+1]
所以如果它发现在一个数组中慢跑等于在另一个数组中慢跑,将下一项复制到另一个数组替换 ?x。
我猜你是在处理基于规则的号角子句,这就是你使用那种格式的原因?