Мой ArrayList не возвращает все элементы

Моя Java-программа ниже отображает все элементы в ArrayList, когда я использую статический метод System.out.println. Однако он отображает только один элемент в ArrayList, когда я возвращаю список в методе. Я буду признателен за некоторые указания о том, что я делаю неправильно:

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class FileProcessor {  
  static List<String> theList = null;

  /**
   * 
   * @return List
   */
  public static List<String> processFiles() {      
    try {    
      File f = new File("/Data/fileDump");
      String[] listOfFiles = f.list();

      for(String eachFile: listOfFiles) {  
        if(eachFile.startsWith("hawk") == true) { 
          theList = new ArrayList<>(); 
          theList.add(eachFile); 
          return theList;
        }
      }
    } catch(Exception e) {
      e.printStackTrace();
    }
    return theList;
  }


  public static void main(String[]args) {
    List<String> dataList = FileProcessor.processFiles(); 
    for(String strg: dataList) {
      if(strg != null) {
        System.out.println(strg);
      }
    }
  }
}

person jonas    schedule 30.06.2018    source источник
comment
Добро пожаловать в Stackoverflow. Пожалуйста, прочитайте как задать хороший вопрос, а затем вернитесь к своему сообщению, чтобы вы могли немного его отредактировать: код повсюду, это хорошая форма, чтобы не только иметь достаточно деталей, но и представлять хорошо отформатированный код.   -  person Mike 'Pomax' Kamermans    schedule 30.06.2018
comment
Вы создаете список внутри цикла, добавляете в него один элемент, а затем возвращаете его. Вы видите, почему это список из одного элемента?   -  person David Conrad    schedule 30.06.2018


Ответы (3)


Замените свою функцию следующей.

      public static List<String>  processFiles() { 
          List<String> theList = null;
          try {    

             File  f = new File("/Data/fileDump");
             String[] listOfFiles = f.list();
             theList = new ArrayList<>(); // initialisation moved outside of loop
             for(String eachFile:   listOfFiles) {  
                 if(eachFile.startsWith("hawk") == true){              
                    theList.add(eachFile); 
               }
             }
             return theList;// return statement moved outside of the loop

          } catch(Exception e) {
             e.printStackTrace();
          }
        return theList;
       }
person Adnan    schedule 30.06.2018

Попробуйте этот код. Всего пара изменений. Я ставлю примечания, где я переместил или удалил код.

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class FileProcessor {  
static  List<String> theList = null;





 /**
  * 
  * @return List
  */
 public static List<String>  processFiles() {      

      try {    


          File  f = new File("/Data/fileDump");

          String[] listOfFiles = f.list();
          theList = new ArrayList<>();  /* Move this here */
          for(String eachFile:   listOfFiles) {  
             if(eachFile.startsWith("hawk") == true){
                theList.add(eachFile);

               /* Deleted the extra return. The one at the end will handle it. */

             }
          }

      } catch(Exception e) {


         e.printStackTrace();
      }
    return theList;
   }


    public static void main(String[]args){
     List<String> dataList = FileProcessor.processFiles(); 
     for(String strg: dataList){
         if(strg != null){
            System.out.println(strg);
         }
     }


    }

}

person Thomas    schedule 30.06.2018

Вы должны вернуться за пределы блока for. В противном случае вы вернетесь с одним элементом. Вы также повторно создаете список в каждом цикле.

person user3311142    schedule 30.06.2018