/ / Връщане на множество стойности от цикъл - java, android, масиви, for-loop, return

Връщането на множество стойности от масив - java, android, arrays, for-loop, return

Имам дейност в приложението си, която отнема aдума за търсене и връща имена на файлове, които съдържат този термин за търсене. Опитвам се да променя този код, за да може той да раздели думата за търсене и да покаже файлове, които съдържат някоя от думите за търсене. Например, ако терминът за търсене е "голямо куче", той ще върне файлове, които имат "голямо" в заглавието и също така файлове, които съдържат "куче" в заглавието.

Частта от кода е:

 if (f.isDirectory()){

return true; // Don"t discard any subdirectories
}

else {


String delimiter = " +";  /* delimiter */
searchname.searchname = searchname.searchname.toUpperCase();

//Split the search string
String [] tempname = searchname.searchname.split(delimiter);
//Array for the file names to be stored
boolean[] namestring = new boolean[tempname.length];
//Counter
int count;
count = 0;

for(int i=0; i<tempname.length; i++)
{
//While i is less than tempname size store filename to namestring array
namestring[i] = name.toUpperCase().contains(tempname[i]);
//Add one to count
count = +1;
//Once count = tempname length you can return all of the array values
if (count == tempname.length){
return namestring[i];
}
}

}
return false;

Моята Java е доста основна и може да ми липсва нещо много очевидно.

Благодаря ви много за вашата помощ


Благодаря на всички ви за много бързите отговори.

Мисля, че разбирам какво казвате. Промених кода си, за да покажа:

public boolean accept(File dir, String name) {

File f = new File(dir, name); // Form the file path "dir/name".

String delimiter = " ";  /* delimiter */
searchname.searchname = searchname.searchname.toUpperCase();

//Split the search string//
String [] tempname = searchname.searchname.split(delimiter);

//Array of Booleans
ArrayList<Boolean> matches = new ArrayList<Boolean>();

if (f.isDirectory()){

return true; // Don"t discard any subdirectories
}

else {


for(int i=0; i<tempname.length; i++)
{

// Toast.makeText(getApplicationContext(), (tempname[i]), Toast.LENGTH_SHORT).show();
matches.add(name.toUpperCase().contains(tempname[i]));
}

}

return matches;

}});

Въпреки това в Eclipse тя показва "съвпадения за връщане"; катоГрешка "Несъответствие на типа: не може да се преобразува от ArrayList в булева". Ако направя предложените промени, той поставя грешки в частта "public boolean accept (File dir, String name) {". Някакви предположения?

Отговори:

0 за отговор № 1

Функцията трябва да връща булев по своята дефиниция: обществено boolean accept (File dir, String name) но вие връщате ArrayList.

Вероятно това е, което искате:

public boolean accept(File dir, String name) {
File f = new File(dir, name); // Form the file path "dir/name".
String delimiter = " ";  /* delimiter */
searchname.searchname = searchname.searchname.toUpperCase();

//Split the search string//
String [] tempname = searchname.searchname.split(delimiter);

if (f.isDirectory()){
return true; // Don"t discard any subdirectories
} else {
for(int i=0; i<tempname.length; i++){
// Toast.makeText(getApplicationContext(), (tempname[i]), Toast.LENGTH_SHORT).show();
if(name.toUpperCase().contains(tempname[i])) {
return true;
}
}
}

return false;
}

4 за отговор № 2

и едно нещо, което сте пропуснали, е

count = +1;

във вашия цикъл. Трябва да бъде

cout++;

или

cout = count+1;

0 за отговор № 3

Забележи, че return namestring[i] се връща само една стойност (и както е споменато няма да бъде достигната). За да върнете всички стойности на масива, трябва да обявите метода като връщащ масив и след това просто да върнете масива namestring т.е.

public boolean[] yourMethod()
{
boolean[] namestring = ....
//Your code
return namestring;
}

Мисля, че трябва да използвате List за вашия тип връщане, Във вашия метод прилагате Arraylist на Strings (или boolean, ако желаете). Предимството на това е, че ще имате наличен динамичен размер, т.е. ако думата ви за търсене е "Big dog" и имате 20 файла и 5 от тях съвпадат, масивът, който създавате, има само 2 елемента, така че ще се върнат само две от имената на файлове. Ако го направите като Списък, той ще расте динамично, докато добавяте повече.

За да възпишете:

List<String> matches = new ArrayList<String>();

Тогава, когато намерите съвпадение във вашия цикъл (псевдокод):

 //For each file name
// For each search term
// If name contains search term
// Add to list
matches.add(name)   // Actual code to add to list.

След това върнете списъка

return matches;

0 за отговор № 4

коментари по темата:

  1. count = +1 трябва да се броят + = 1
  2. ако искате да се върнете, след като за цикъла завършва, не се нуждаят от броене, просто сложи връщане изречение извън за цикъл
  3. искате да върнете масив както във вашите коментари, но връщате само една булева стойност и винаги последната
  4. изглежда, че не трябва да връщате масив като вассамо трябва да се определи дали името на файла съдържа някой от термина, можете просто да върнете true, когато някое от разделения масив се съдържа в името на файла.
  5. Вашият код използва "+" като разделител, но споменахте "голямо куче" като пример, чийто разделител е
  6. Опитайте се да отстраните неизправности с това отстраняване на грешки или регистриране, за да анализирате коя част не работи, както очаквате