Как удалить дубликаты из дерева с помощью пользовательских объектов - PullRequest
0 голосов
/ 16 октября 2018

У меня есть ArrayList (cntct) ParseMessage's.ParseMessage имеет

private long dateSent;
private String contact;
private String body;

с геттерами и сеттерами, сгенерированными Eclipse.Я пытаюсь получить самое последнее сообщение от каждого контакта.Поэтому я решил сделать это так:

SortedSet<ParseMessage> cntctList = new TreeSet<ParseMessage>(new Comparator<ParseMessage>() {
@Override
public int compare(ParseMessage o1, ParseMessage o2)
{   
    if(o1 == null || o2 == null)
        return 0;
    if(o1.getContact().equals(o2.getContact()))
        return 0;
    if(o1.getDateSent() <= o2.getDateSent())
        return 1;
    return -1;
}           
});
cntctList.addAll(cntct);

Я, кажется, что-то упустил в этом, поскольку я все еще получаю ограниченное количество дубликатов.Я использую, возможно, 100 сообщений с 5 контактами, и набор заканчивается размером 7

РЕДАКТИРОВАТЬ:

ParseMessage переопределяет .equals и .hasCode как таковые

@Override
public int hashCode() {
    return getContact().hashCode();
}

@Override
public boolean equals(Object e) {
    if(!(e instanceof ParseMessage))
    {
        return false;
    }

    return ((ParseMessage) e).getContact().equals(getContact());
}

END:

Также это для интернет-звонка.Если кто-нибудь увидит способ сделать это быстрее, то я хотел бы услышать идеи.

1 Ответ

0 голосов
/ 16 октября 2018

Код в вопросе не работает, потому что метод compare нарушает правила, например,

Разработчик также должен убедиться, что отношение транзитивно: ((compare(x, y)>0) && (compare(y, z)>0)) подразумевает compare(x, z)>0.

Например:
compare(A1, B2) вернет <0, потому что <code>A != B && 1 < 2
compare(B2, A3) вернет <0, потому что <code>B != A && 2 < 3
compare(A1, A3) вернул бы 0, потому что A == A, но правила требуют, чтобы он возвратил <0 </p>

Когда правила нарушены, результат является недетерминированным.


Для построенияколлекция ParseMessage, содержащая только самое последнее сообщение от каждого контакта, вы должны создать Map.

List<ParseMessage> cntct = /*...*/;

// Build map of contact to most recent message
Map<String, ParseMessage> cntctMap = cntct.stream().collect(Collectors.toMap(
        ParseMessage::getContact,
        Function.identity(),
        (a, b) -> a.getDateSent() >= b.getDateSent() ? a : b
));

Если требуется коллекция сообщений, вызовите значения ():

Collection<ParseMessage> cntctList = cntctMap.values();
...