Как искать и заменять в 2d-массиве в Android

У меня есть sqlite db с 4 столбцами. то есть id , тело правила, минусы и логическое значение. я могу вставить в него данные и извлечь их с помощью курсора и сохранить в массиве 2d. примерная строка может быть такой

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)

он должен заменить ?x в 2darray и ввести alan вместо ?x.

1      jogging(alan)                  athelete(alan)      0
2      athelete(alan)                 runsfast(alan)      0
3      athelete(alan),runsfast(alan)  champion(alan)      0

ЕСЛИ обнаружен бег трусцой (алан), скопируйте минусы бег (алан) в новый массив [].

newarray[athelete(alan)]

newarray[] теперь содержит спортсмена (алан). теперь новый массив [] был обновлен, поэтому снова найдите спортсмена (алана), если он будет найден, сохраните быстро (алан) в новый массив []. снова обновлено, и у нас есть спортсмен (алан), быстро бегает (алан) в новом массиве [].

newarray[athelete(alan),runfast(alan)]

теперь найдите спортсмена (алан), быстро бегает (алан) и добавьте чемпиона (алан) в новый массив [] повторите снова, и на этот раз совпадений не найдено, поэтому выходите.

newarray[athelete(alan),runfast(alan),runfast(alan)]

любые идеи, пожалуйста


person ijaz khattak    schedule 09.05.2016    source источник
comment
Можете ли вы сделать этот поиск в вашей базе данных?   -  person AxelH    schedule 09.05.2016
comment
@AxelH я предпочитаю использовать массивы, но любая идея приветствуется.   -  person ijaz khattak    schedule 09.05.2016
comment
Если вам нужен только результат вашего поиска, пусть sqlite сделает всю работу, WHERE rule_body LIKE... было бы проще, но с некоторыми ограничениями. Если нет, вам просто нужен цикл и проверьте правильные столбцы для определенного контента, используя регулярное выражение, которое может помочь. К простому решению.   -  person AxelH    schedule 09.05.2016
comment
Спасибо за ваши Коментарии. это может быть полезно для меня.   -  person ijaz khattak    schedule 09.05.2016
comment
но это не тот запрос, который можно выполнить с помощью LIKE. но регулярное выражение может сыграть роль   -  person ijaz khattak    schedule 09.05.2016
comment
Почему LIKE не сработал? Я сделал это для фильтра. Если бы вы могли объяснить немного лучше условие, я мог бы найти что-то.   -  person AxelH    schedule 09.05.2016
comment
@AxelH, например, у меня есть сохраненные в массиве [0] [2] значения человека (? X), затем я использую текстовое поле для ввода человека (алан), что означает, что? x - это переменная, которая хранит значение alan . теперь я хочу искать в массиве, где ?x появляется между текстом. как только он будет найден, замените ?x на alan. это первая часть, которую я хочу сделать. как только совпадение найдено и заменено, значение массива, смежное с массивом [0] [3], должно быть сохранено в одномерном массиве. поскольку поиск будет рекурсивным в одномерном массиве до тех пор, пока не будет пройден весь массив 2d, и никакое значение не может быть введено в один массив d.   -  person ijaz khattak    schedule 10.05.2016


Ответы (4)


один из способов - использовать разделение с использованием символа в вашем случае (так что он разделит бег (? X) на бег трусцой и? x), вы можете его разбить), используя метод замены. аналогично сделайте это с jogging (alan), так что это будет joggin и alan), добавьте их в arraylist или любую структуру хранения, которую вы можете легко использовать. в случае массива вы можете искать, если

rule[x] Matches fact[x] 
copy fact[x+1] into rule[x+1] 

поэтому, если он обнаружит, что пробежка в одном массиве равна пробежке в другом массиве, скопируйте следующий элемент в другой массив, заменив ?x.

я полагаю, ты работаешь над пунктами, основанными на правилах, поэтому ты используешь такой формат?

person Shahensha Khan    schedule 31.05.2016

Используйте HashMap для хранения элементов одной строки с уникальными ключами и сохранения карт в массиве. Вы можете получить каждую карту в цикле и получить значение для ключа.

person harsha javagal    schedule 09.05.2016

Я думаю, что лучшим подходом, чем сохранение ссылки на ваши данные sqlite в массиве, было бы использование загрузчика курсора и работа с курсором в позиции, а затем работа с 2d-массивами. Курсоры временные, их можно закрыть и выбросить. Легче манипулировать, используя подкачку курсора в адаптере... и так далее. Просто идея.

person daxgirl    schedule 09.05.2016

Я редактирую полный ответ, так как вы обновляете вопрос, чтобы подать правильный пример.

Используя 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);

Это должно вернуть правильную строку, соответствующую нужному имени. Вам нужно установить ИМЯ, а не текст из ввода (извлечь имя)

Если вы действительно хотите работать со своим массивом, вам нужно зациклить массив и проверить второй и третий столбцы (я думаю, в обоих полях).

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 + ')', поможет.

person AxelH    schedule 10.05.2016
comment
На самом деле у меня есть база данных, в которой формат сохраняется в том, что вы написали выше, например, идентификатор, тело правила и т. Д. Я получаю их в 2d-массиве. теперь пользователь может ввести ввод в виде jogging(alan), в этом случае мне нужно извлечь alan и заменить ?x в массиве, а athelete(alan) будет сохранен в другом массиве (этот массив, если он будет обновлен, будет запустить другой поиск), например, если я получу ателте (алан) и у меня есть спортсмен (алан) в 2darray с следствием бега (алан), тогда бега (алан) будет снова сохранен в массиве до тех пор, пока обновление не будет найдено. это своего рода система, основанная на правилах. - person ijaz khattak; 10.05.2016
comment
Отредактируйте свой вопрос, чтобы объяснить, показать точную структуру вашей БД, тип поиска (какую строку вы будете использовать), ожидаемый результат. Раздел комментариев для этого бесполезен. И постарайтесь быть читабельным... - person AxelH; 10.05.2016
comment
пожалуйста, посмотрите сейчас @Axelh - person ijaz khattak; 10.05.2016