1

Пользователь вводит в несколько полей для ввода соответственно некие данные. При нажатии на кнопку программа должна понять, полностью ли соответствуют введённые данные тем, что содержатся в уже имеющемся массиве (r1), или почти полностью (не хватает только одного элемента). Если первое условие выполняется, то программа указывает на это в массиве rezmax в элементе с соответствующем номером; если второе условие выполняется - то в массиве similar. В общем, всё прекрасно работает, но проблема в том, что этих уже имеющихся массивов у меня по идее должно быть штук 600. Не взорвётся ли телефон с такой программой, если для 30 массивов студия уже ругается?

String[] r1={"item1","item2","item3","item4","item5"};

String[] check= {editText1.getText().toString(),editText2.getText().toString(),editText3.getText().toString(),editText4.getText().toString(),editText5.getText().toString()};
           String checkst=Arrays.toString(check);


int[] rezmax={0,0,0};
int[] similar={0,0,0};
int i1;int i2;int i3;int i4;

if(Arrays.asList(check).containsAll(Arrays.asList(r1))){rezmax[1]=1;} else {
for( i1 =0; i1 < r1.length; i1++) {if(checkst.contains(r1[i1])) {
for(i2 =0; i2 < r1.length&&i2!=i1; i2++){if(checkst.contains(r1[i2])){                
for( i3 =0; i3 < r1.length&&i3!=i2; i3++){if(checkst.contains(r1[i3])){
for(i4 =0; i4 < r1.length&&i4!=i3; i4++){if(checkst.contains(r1[i4])){
similar[1]=1;}}}}}}}}}

ОБНОВЛЕНИЕ

Вот товарищ zRrr хорошую идею подкинул. Если вычесть check из r1, и при этом останется, так сказать, ноль, то можно заявить о том, что rezmax[1]=1;. А если же при этом в r1 останется один элемент, не совпадающий с одним из элементов check, значит similar[1]=1;. Также, zRrr сказал что-то про множества, но совсем не понял, что мне с ними в данном случае делать. Помогите, господа!

ОБНОВЛЕНИЕ ОБНОВЛЕНИЯ

В общем, вот, что я насоображал. Жаль только, не работает. Да и по размеру не меньше предыдущей конструкции. Горе я программист :(

ArrayList<String> list = new ArrayList<>();
int counter = 0;
Arrays.asList(r1).removeAll(Arrays.asList(check)); // здесь я вычитаю один массив из другого, и, кажется, тут что-то не так
for (String s : r1) if (!s.isEmpty()) list.add(s); // здесь я удаляю пустые элементы, которые должны стать пустыми после вычитания
r1=list.toArray(new String[list.size()]);
for (int i = 0; i < r1.length; i++) // здесь я подсчитываю количество оставшихся
{if (r1[i] != null) counter ++;}
if(counter==0){rezmax[1]=1;}else if(counter==1){similar[1]=1;} // а здесь подвожу итоги 

Лог ошибки приложить, к сожалению, не могу, потому что силы зла неведомым образом поломали все эмуляторы, а любое андроид устройство компьютер вообще перестал видеть, но это уже совсем другая история :/

  • всё зависит как правильно вы пропишите логику, операция по сути простая, существуют очень сложные механизмы фильтрации, которые работаю к примеру с БД с огромным кол-вом таблиц и полей, при этом динамически выводятся нужные данные, ничего всё же работает отлично, так вот и у вас не будет проблем... если не намудрите) – Shwarz Andrei Feb 14 '16 at 14:06
  • @ShwarzAndrei , дак ругается же, говорит OnClick is too complex to analyze by data flow algorithm, это норма? А с логикой у меня всё в порядке? – i am so lame Feb 14 '16 at 14:09
  • что ж вы так пробелы и переводы строк экономите... Зачем вы 4 раза проверяете, входит ли в строку со всеми данными от пользователя строка из проверочного массива? – zRrr Feb 14 '16 at 14:38
  • @zRrr, насчёт пробелов и переводов строк не понял, это был сарказм? :/ А насчёт 4х раз, это ж я проверяю, соответствуют ли 4 каких-либо элемента из массива пользователя каким-нибудь 4м элементам из массива уже имеющегося. Я как-то мудрено это сделал? Можно проще? – i am so lame Feb 14 '16 at 14:48
  • Не, я просто слабый программист, меня такое нагромождение букв, цифр и скобок пугает. По теме, если порядок строк важен, то вот алгоритм проверяющий, что две строки различаются не более чем на символ. Если нет, и строки уникальны, то используйте HashSet (выкидывйте из множества введенные строки, считайте количество ненайденных, смотрите, сколько осталось). Если строки не уникальны, то нужен Multiset или HashMap<String, Integer>. – zRrr Feb 14 '16 at 15:51
  • @zRrr, походу дела это я слабый программист, ибо уже целый час вчитываюсь в ваш комментарий и материалы по теме множеств, но всё не понимаю, как использовать это в моей программе :/ Всё, что мне удалось понять - это то, что множества представляют собой многомерные массивы, где все элементы сортируются по категориям. – i am so lame Feb 14 '16 at 18:46
  • @zRrr, Вы вот говорите "выкидывйте из множества введенные строки, считайте количество ненайденных, смотрите, сколько осталось", по логике вроде то, что мне нужно, но как это записать, не представляю. Ну то есть представляю, но только так: if(r1-check==0){rezmax[1]=1;}else if(r1-check==один элемент из r1 не совпал с одним элементом check){similar[1]=1;}. – i am so lame Feb 14 '16 at 18:47

0 Answers0