Как сортировать списки объектов, используя Java - PullRequest
1 голос
/ 15 апреля 2019

У меня есть 2 списка, которые содержат одинаковые объекты, но неупорядоченные, и я хочу сначала отсортировать их, прежде чем сравнивать, чтобы проверить, равны ли они.

Один элемент каждого списка выглядит так:

первый список:

AuditRow{dateStr='2019-04-15 11:16', userStr='admin', entityStr='Users'}

второй список:

AuditRow{dateStr='2019-04-15 10:28', userStr='admin', entityStr='Users'}

Я пытался использовать Comparatorдля этого вопроса, но безуспешно, я должен сказать, что оба списка получили более 10 пунктов.

Я хочу достичь цели сортировки моих списков по дате и времени (в основном полагаясь на час, поскольку дата одинакова для всех элементов).

Вот что я пробовал:

    Override
    public int compareTo(AuditRow auditRow) {
        int compareage = Integer.parseInt(((AuditRow)auditRow).dateStr.replace(" ",""));
        return Integer.parseInt(this.dateStr.replace(" ",""))-compareage; 
    }

Но это не сработало

Ответы [ 3 ]

2 голосов
/ 15 апреля 2019

, если вы хотите отсортировать их по dateStr:

list.sort((obj1,obj2) ->{SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm");
return sdf.parse(obj1.getDate()).compareTo(sdf.parse(obj2.getDate());}

Я предположил, что dateStr является строкой, поэтому я включил преобразование здесь, если они уже являются датами, тогда просто сделайте (obj1,obj2) -> obj1.getDate().compareTo(obj2.getDate())

РЕДАКТИРОВАТЬ: как указал @RobertKock, вам даже не нужно конвертировать строку в дату, вы можете сравнить ее без преобразования.

1 голос
/ 15 апреля 2019

Использование компаратора:

List(AuditRow) myList;
Collections.sort(myList, new Comparator<AuditRow>{
    public int compare(AuditRow ar1, AuditRow ar2) {
        return ar1.getDateStr().compareTo(ar2.getDateStr());
    }
});

То же, что и выше, но с использованием лямбда-выражений (Java 8 +):

List(AuditRow) myList;
Collections.sort(myList, (ar1, ar2) -> 
        ar1.getDateStr().compareTo(ar2.getDateStr()});

Если ваш компаратор создан из сравнения свойств, вы можете использовать:

List(AuditRow) myList;
myList.sort(myList, 
        Comparator.comparing(AuditRow::getDateStr)
            .thenComparing(AuditRow::userStr));
1 голос
/ 15 апреля 2019

Я не знаю, что вы пытались с компаратором. Вы пробовали использовать как это:

Сначала вы создаете компаратор по полю, которое вы хотите использовать в вашем случае date time.

Comparator<AuditRow> compareByDate = (AuditRow a1, AuditRow a2) -> a1.getDateStr().compareTo(a2.getDateStr());

Затем вы используете созданный выше компаратор в качестве параметра в виде:

Collections.sort(auditRowList, compareByDate);
...