#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