Найти и вернуть все дубликаты заданного пользователем ввода в arrayList (целые и строковые значения) - PullRequest
0 голосов
/ 18 ноября 2018

Проблемы с новичком.У меня есть arrayList с несколькими элементами, и у меня возникают проблемы при попытке вернуть список всех дубликатов.Информация, которую я храню в arrayList:

LogEntry(LocalDateTime date, String status, int id, String cod)

2018-10-23T12:05:22 DATA 325 6d33
2017-01-13T10:09:30 INFO 325 5f22
2018-05-10T18:55:30 INFO 111 6a23
2018-05-03T17:44:50 ERROR 325 5f22
2017-06-15T16:25:31 DATA 111 8472

ArrayList<LogEntry> logList = new ArrayList();

Я пытался использовать это для поиска строковых записей:

    String logLevel;
    System.out.println("Search Log Level:\n(Info, Debug, Error)");
    logLevel = read.nextLine().toUpperCase();

    List<Integer> allIndexes
            = IntStream.range(0, logList.size()).boxed()
                    .filter(i -> logList.get(i).status.equals(logLevel))
                    .collect(Collectors.toList());

    // check duplicates      
    for (int i = 0; i < allIndexes.size(); i++) {
        System.out.println(logList.get(i).checkData());          
    }

Но у меня получаются смешанные результаты (получены неверные результаты)при запуске с другого компьютера).

Попытка адаптироваться к поиску целых чисел просто не работает:

private static void id_n() {
    int logid;
    System.out.println("ID:\n");
    logid = read.nextInt();

    List<Integer> allIndexes
            = IntStream.range(0, logList.size()).boxed()
                    .filter(i -> logList.get(i).id.equals(logid))
                    .collect(Collectors.toList());

    for (int i = 0; i < allIndexes.size(); i++) {
        System.out.println(logList.get(i).checkData());
    }

}

Так что я уже боюсь пытатьсяполучить диапазон дат из этого беспорядка.

Что я здесь не так делаю?Как это можно улучшить?Спасибо за любую помощь.

Почти забыл, checkData - это функция из моего класса LogEntry:

public String checkData() {
            return " > " + this.date + " " + this.status + " " + this.id + " " + this.cod;
    }

Решено , спасибо @JB Nizet и @ Deadpool

статус :

logList.stream().filter(i -> i.status.equals(logLevel)).forEach(j -> System.out.println(j.checkData()));

id :

logList.stream().filter(i -> i.id == logid).forEach(j -> System.out.println(j.checkData()));

Для дальнейшей обработки собранных данных я только что отправил ихновый массивList.
status :

ArrayList<LogEntry> logLevels = new ArrayList();
logList.stream().filter(i -> i.status.equals(logLevel)).forEach(j -> logLevels.add(0, j));

1 Ответ

0 голосов
/ 18 ноября 2018

Я полагаю, IntStream не очень хорошая идея, вместо этого направлять объект logList напрямую для получения дубликатов

Фильтрация по состоянию и печать дублирующихся значений

logList.stream().filter(i->i.getStatus().equals(logLevel)).forEach(j->System.out.println(j.checkData());

Фильтрация по идентификатору и печать дублированных значений

logList.stream().filter(i->i.getId==logid).forEach(j->System.out.println(j.checkData());
...