Discuss / Java / 关于消息相同的判断

关于消息相同的判断

Topic source

日落有星

#1 Created at ... [Delete] [Delete and Lock User]

首先消息最好是需要进行排序的,也就是说最好是采用 TreeSet。

那么就需要对 Message 类覆写 compare() 方法,或者实现 Comparable  接口。

但是如果仅仅是比较 sequence 足够判断两条消息是否是相同的吗?

如果 sequence 代表的是发送消息的时间,并且时间精度够高,使得两条不同的消息的 sequence 不存在重复,那仅仅判断 sequence 就可以区分不同的消息。但是显然这里应该是不够的,它允许会存在诸如以下的情况:

        List<Message> received = List.of(
            ...
            new Message(2, "发工资了吗?"),
            new Message(2, "发了工资吗?"),
            ...
        );

那么在判断 sequence 的同时最好还需要判断发送消息的内容是否相同:

    static List<Message> process(List<Message> received) {
        // TODO: 按sequence去除重复消息
        Set<Message> set_rec = new TreeSet<>(new Comparator<Message>(){
            @Override
            public int compare(Message m1, Message m2){
                if (m1.sequence == m2.sequence) { // 对于发送时间相同的情况,判断其消息内容是否相同
                    //return m1.text.compareTo(m2.text); // 这个会按text重新排列消息顺序
                    if (!m1.text.equals(m2.text)) {
                        return 1; // 不打乱消息的入队顺序,-1就逆序
                    }
                }
                return Integer.compare(m1.sequence,m2.sequence);
            }
        });
        set_rec.addAll(received);
        List<Message> newreceived = new ArrayList<>(set_rec);
        return newreceived;
    }

  • 1

Reply