如何在 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。

我猜你是在处理基于规则的号角子句,这就是你使用那种格式的原因?