как упростить мой Java-код, который содержит больше ArrayList для хранения значений

#java

#java

Вопрос:

Я провожу тестирование Junit для некоторых модулей. Я считываю входные данные и ожидаемый результат из файла csv, а затем сохраняю каждый столбец в одном списке массивов, а затем помещаю все списки столбцов в карту. Моя проблема в том, что если один или два столбца означают, что код достаточно хорош для просмотра, но если в файле CSV более одного столбца, это означает, что код выглядит странно. Я хочу упростить этот ArrayList в какую-либо другую структуру данных Java, если это возможно.

     //Loading Input Data File for Default Sorting
    static String attemptsString = "colAttempts";
    static String areacodeString = "colAreaCodes";
    static String startTimeString = "colStartIme";
    static String timezoneString = "colTimeZone";
    static String firstNameString = "colFirstName";
    static String expAttemptsOrderStr = "colExpAttempts";
    static String expAreaCodesOrderStr = "colExpAreaCodes";
    static String expStartTimeOrderStr = "colExpStartTimes";
    static String expTimeZoneOrderStr = "colExpTimeZone";
    static String expFirstNameOrderStr = "colExpFirstNames";
    static List<String> CN_inputAttempts = new ArrayList<String>();
    static List<String> CN_inputAreaCodes = new ArrayList<String>();
    static List<String> CN_inputStartTime = new ArrayList<String>();
    static List<String> CN_inputTimeZone = new ArrayList<String>();
    static List<String> CN_inputFirstNames = new ArrayList<String>();
    static List<String> CN_ExpOrderAttempts = new ArrayList<String>();
    static List<String> CN_ExpOrderAreaCodes = new ArrayList<String>();
    static List<String> CN_ExpOrderStartTime = new ArrayList<String>();
    static List<String> CN_ExpOrderTimeZone = new ArrayList<String>();
    static List<String> CN_ExpOrderFirstName = new ArrayList<String>();
public static HashMap<String, List<String>> loadforConatactNameWithAreaCodes(String ContactNamesFileName) throws FileNotFoundException{

    HashMap<String,List<String>> contactNamewithAreaCodesMap = new HashMap<>();

    InputStream inputStream = new FileInputStream(ContactNamesFileName);
    try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))){
            String[] dataArray = null;
            String line = "";
            int index = 0;
            /*
             * CSV File indexes values initialization
             */
            int ATTEMPTS = 0;
            int AREA_CODES = 1;
            int START_TIME = 2;
            int TIME_ZONE = 3;
            int FIRST_NAME = 4;
            int EXP_ORDER_ATTEMPTS = 5;
            int EXP_ORDER_AREACODES = 6;
            int EXP_ORDER_STARTTIME = 7;
            int EXP_ORDER_TIMEZONE = 8;
            int EXP_ORDER_FIRST_NAME = 9;

            while ((line = br.readLine()) != null) {
                index  ;
                dataArray = line.split(csvSplitBy);
                if (index == 1) {
                    continue;
                }
                if(line.contains("#")) {
                    System.out.println("Skipping commented Row in attempts Input Data Source at line " index " in " ContactNamesFileName " file");
                }else {
                    if((dataArray[ATTEMPTS].length()>0) amp;amp; (dataArray[AREA_CODES].length()>0)  amp;amp; (dataArray[START_TIME].length()>0) amp;amp; (dataArray[TIME_ZONE].length()>0) amp;amp; (dataArray[FIRST_NAME].length()>0) amp;amp; (dataArray[EXP_ORDER_ATTEMPTS].length()>0)
                            amp;amp; (dataArray[EXP_ORDER_AREACODES].length()>0) amp;amp; (dataArray[EXP_ORDER_STARTTIME].length()>0)  amp;amp; (dataArray[EXP_ORDER_TIMEZONE].length()>0) amp;amp; (dataArray[EXP_ORDER_FIRST_NAME].length()>0)) {
                        CN_inputAttempts.add(dataArray[ATTEMPTS]);
                        CN_inputAreaCodes.add(dataArray[AREA_CODES]);
                        CN_inputStartTime.add(dataArray[START_TIME]);
                        CN_inputTimeZone.add(dataArray[TIME_ZONE]);
                        CN_inputFirstNames.add(dataArray[FIRST_NAME]);
                        CN_ExpOrderAttempts.add(dataArray[EXP_ORDER_ATTEMPTS]);
                        CN_ExpOrderAreaCodes.add(dataArray[EXP_ORDER_AREACODES]);
                        CN_ExpOrderStartTime.add(dataArray[EXP_ORDER_STARTTIME]);
                        CN_ExpOrderTimeZone.add(dataArray[EXP_ORDER_TIMEZONE]);
                        CN_ExpOrderFirstName.add(dataArray[EXP_ORDER_FIRST_NAME]);

                        contactNamewithAreaCodesMap.put(attemptsString,CN_inputAttempts);
                        contactNamewithAreaCodesMap.put(areacodeString,CN_inputAreaCodes);
                        contactNamewithAreaCodesMap.put(startTimeString,CN_inputStartTime);
                        contactNamewithAreaCodesMap.put(timezoneString,CN_inputTimeZone);
                        contactNamewithAreaCodesMap.put(firstNameString,CN_inputFirstNames);
                        contactNamewithAreaCodesMap.put(expAttemptsOrderStr,CN_ExpOrderAttempts);
                        contactNamewithAreaCodesMap.put(expAreaCodesOrderStr,CN_ExpOrderAreaCodes);
                        contactNamewithAreaCodesMap.put(expStartTimeOrderStr,CN_ExpOrderStartTime);
                        contactNamewithAreaCodesMap.put(expTimeZoneOrderStr,CN_ExpOrderTimeZone);
                        contactNamewithAreaCodesMap.put(expFirstNameOrderStr,CN_ExpOrderFirstName);

                    }else {
                        System.out.println("Object not created for data at line " index " in " ContactNamesFileName " file");
                    }
                }
         }              
    } catch (FileNotFoundException e) {
            e.printStackTrace();
    } catch (IOException e1) {
            e1.printStackTrace();
    }
    return contactNamewithAreaCodesMap;

}

  

Комментарии:

1. попробуйте создать класс, содержащий один набор данных

2. Вопросы о рефакторинге рабочего кода не по теме для Stack Overflow.

3. @ScaryWombat я создал отдельный класс для чтения этих данных и в методе, который я использовал arraylist для хранения значения

4. @Michael Да, рефакторинг рабочего кода.

Ответ №1:

Тыр с созданием класса с List для хранения данных или создания списка из списка List<List<String>>

Комментарии:

1. можем ли мы использовать какую-либо другую структуру данных для хранения этих данных

2. у @Mohamednoush есть какая-либо другая структура данных, почему? Каковы ваши критерии здесь?

3. потому что я создаю так много ArrayList для хранения каждого столбца файла

Ответ №2:

Ну, почему бы не создать класс, содержащий все необходимые поля, чтобы 1 строка в CSV соответствовала 1 экземпляру этого класса. Затем вы можете использовать конструктор (или статический метод), который получает строку и анализирует из нее нужные значения.Пример

 class CSVRow {
    private int attempts;
    ...

    public static CSVRow fromCSV(String row) {
        // parse logic
    }
}
  

Комментарии:

1. у меня есть всего пять CSV-файлов, в которых есть 8 столбцов ввода и ожидаемые результаты. Так что я попробовал этот подход. т. Е. Одна карта, содержащая список значений каждого столбца

2. Я не понимаю, почему вы придерживаетесь использования Map… Просто заполните List<CSVRow>. У вас есть 5 файлов CSV, ну, у вас будет 5 списков. Если вам нужно сравнить значения, вы можете переопределить метод equals для CSVRow