Как сравнить два списка с разными ссылками на имена, но с одинаковыми фактическими данными

#java #string #list #selenium #object

#java #строка #Список #селен #объект

Вопрос:

У меня есть 2 списка, которые имеют одинаковый контент, но с разными ссылками на имена.

У меня есть таблица, которую я загружаю с помощью кнопки «Экспорт», которая загружает файл CSV в мою локальную файловую систему, и я получаю таблицу, используя selenium. Я пытался преобразовать эти списки в «Коллекции», но это не помогло.

Вот как выглядит мой список CSV:

 AuditCsvRow{dateStr='"2019-04-14 11:48"', userStr='"admin"', entityStr='"Users"', actionStr='"Login"', nameStr='"admin"', descriptionStr='"User login successful: admin"', clientIpStr='"192.168.51.35"'}
  

Это список, загруженный с помощью selenium:

 AuditRow{dateStr='2019-04-14 11:48', userStr='admin', entityStr='Users', actionStr='Login', nameStr='admin', descriptionStr='User login successful: admin', clientIpStr='192.168.51.35', clientIpTxt='192.168.51.35'}
  
 List<AuditRow> uiRowList = new ArrayList<>();
        List<AuditCsvRow>CSVrows = readAuditLogFromCSV(CSV_FILE_PATH);
        uiRowList = auditPage.getAudittable();
 Collection listOne = new ArrayList(Arrays.asList(CSVrows));
        Collection listTwo = new ArrayList(Arrays.asList(uiRowList));

        listOne.equals(listTwo);
  
 private List<AuditRow> readAuditLogFromCSV(String fileName) throws IOException {
        List<AuditRow> rowsList = new ArrayList<>();
        Path pathToFile = Paths.get(fileName);

        try(BufferedReader br = Files.newBufferedReader(pathToFile, StandardCharsets.US_ASCII)){
            String line = br.readLine();
            while(line != null){
                String[] attributes = line.split(",");
                AuditRow auditCsvRow = auditPage.createCsvRow(attributes);
                rowsList.add(auditCsvRow);
                line = br.readLine();
            }
        }
        return rowsList;
    }
  

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

1. Измените свой readAuditLogFromCSV метод для загрузки данных в AuditRow объекты и избавьтесь от повторяющегося класса AuditCsvRow , также избавьтесь от строк Collection listOne = new ArrayList(Arrays.asList(CSVrows)); Collection listTwo = new ArrayList(Arrays.asList(uiRowList)); , поскольку они не делают ничего полезного uiRowList и CSVRows уже являются списками.

2. Списки не содержат одинакового содержимого. Первый список содержит двойные кавычки, которых нет во втором списке. По-видимому, ваш метод чтения CSV для первого должен был содержать символ кавычки.

3. Спасибо @ErwinBolwidt Я воспользовался вашим предложением, но теперь я столкнулся с проблемой, когда мой элемент в списке по какой-то причине заключен в двойные кавычки, вот как я разбираю CSV-файл в список (ОТРЕДАКТИРОВАЛ СВОЙ ВОПРОС В КОНЦЕ).

4. @RealSkeptic — Как бы вы справились с двойными кавычками? Я добавил к своему вопросу метод, который я использую для разбора строк CSV в список.

5. Я бы использовал анализатор CSV, доступны общие библиотеки. CSV — это не просто разделение по запятым. Необходимо обработать кавычки и экранирование.

Ответ №1:

Ответ @Erwin Bolwidt очень хорош, он помогает вам сократить дублирование кода. Тем не менее, я хотел бы поделиться своим трюком для сравнения подобных объектов.

В принципе, я бы проанализировал их в Json и сравнил строки

 Gson gson = new Gson();
boolean isTheSameData = gson.toJson(CSVrows).equals(gson.toJson(uiRowList));