Discuss / Java / 【作业】-TreeSet去重

【作业】-TreeSet去重

Topic source

两种方式构建TreeSet

import java.util.*;


public class Test {
    public static void main(String[] args) {
        List<Message> received = List.of(
            new Message(1, "Hello!"),
            new Message(2, "发工资了吗?"),
            new Message(2, "发工资了吗?"),
            new Message(3, "去哪吃饭?"),
            new Message(3, "去哪吃饭?"),
            new Message(4, "Bye")
        );
        List<Message> displayMessages = process(received);
        for (Message message : displayMessages) {
            System.out.println(message.text);
        }
    }

    static List<Message> process(List<Message> received) {
        // TODO: 按sequence去除重复消息
    	
    	//方式1:在Message内部覆写compareTo方法
    	Set<Message> mess_set = new TreeSet<Message>();
    	mess_set.addAll(received);
    	
    	//方式2:在创建TreeSet的时候,传入Comparator对象,覆写compare方法
//    	Set<Message> mess_set = new TreeSet<Message>(new Comparator<Message>() {
//    		@Override
//    		public int compare(Message m1, Message m2) {
//        		return Integer.compare(m1.sequence, m2.sequence);
//    		}
//		});
    	
    	List<Message> res_List = new ArrayList<Message>();
    	res_List.addAll(mess_set);
    	
        return res_List;
    }
}

class Message implements Comparable<Message> {
	//使用TreeSet去重,并且将自定义的对象作为Set的key,因此需要实现Comparable接口
	
    public final int sequence;
    public final String text;
    public Message(int sequence, String text) {
        this.sequence = sequence;
        this.text = text;
    }
    
    @Override
    public int compareTo(Message o) {
        return Integer.compare(this.sequence, o.sequence);
    }
}

这个addAll()方法是什么用法,为什么message类型的list的元素可以放入set里?

addAll()是set类型对象的方法,直接调用
可以把有重复的message类型的list   放入set里  的原因是

在实现Message类的时候,已经实现了compareTo方法,因此,相同的元素不会重复放入

应忠豪

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

这里为什么要 用TreeSet 类 , 按道理说 最后返回ArrayList 原列表去重后的结果, 如果把原列表 插入顺序改为

 List.of(
            new Message(4, "Hello!"),
            new Message(2, "发工资了吗?"),
            new Message(2, "发工资了吗?"),
            new Message(3, "去哪吃饭?"),
            new Message(3, "去哪吃饭?"),
            new Message(1, "Bye")
        );

那么 用层主的代码 返回的打印 会变为

Bye

发工资了吗?

去哪吃饭?

Hello!

 这样与原先列表插入顺序不同 改变了列表索引。


  • 1

Reply