TreeSet使用疑问

import java.util.TreeSet;
class Stu implements Comparable{
	String id;
	String name;
	int score;
	public Stu(String id, String name, int score) {
		this.id = id;
		this.name = name;
		this.score = score;
	}
	public String toString() {
		return  id + ":" + name + ":" + score;
	}
	public int compareTo(Object o) {
		Stu st = (Stu)o;
		if(id.equals(st.id))
			return 0;
		if(name.equals(st.name))
			return id.compareTo(st.id);
		return name.compareTo(st.name);		
	}	
}
public class Example12 {
	public static void main(String[] args) {
        TreeSet<Stu> ts = new TreeSet<>();     
		ts.add(new Stu("001","Mike",100));
		ts.add(new Stu("002","Jack",400));
		ts.add(new Stu("002","Tom",300));
		ts.add(new Stu("004","Rose",400));
		System.out.println(ts);
	}
}

运行结果如下:

相同学号2没有被去掉,为什么?感觉程序没有什么问题啊

不相同啊,为什么会相同呢,只是学号相同,对象又不是同一个对象。

new关键字会给对象分配不同的内存地址,即时内容相同,但内存地址不同,他们也不是相同的对象。所以该set集合不会去掉。

import java.util.TreeSet;
class Stu implements Comparable{
	String id;
	String name;
	int score;
	public Stu(String id, String name, int score) {
		this.id = id;
		this.name = name;
		this.score = score;
	}
	public String toString() {
		return  id + ":" + name + ":" + score;
	}
	public int compareTo(Object o) {
		Stu st = (Stu)o;
		return id.compareTo(st.id);
	}	
}
public class Example12 {
	public static void main(String[] args) {
        TreeSet<Stu> ts = new TreeSet<>();     
		ts.add(new Stu("1","Mike",100));
		ts.add(new Stu("2","Jack",400));
		ts.add(new Stu("2","Tom",300));
		ts.add(new Stu("4","Rose",400));
		System.out.println(ts);
	}
}

 

这个可以去掉啊

 

import java.util.TreeSet;
//定义Teacher类实现Comparable接口
class Teacher implements Comparable { 
	String name;
	int age;
	public Teacher(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public String toString() {	        
		return name + ":" + age;
	}
	//重写Comparable接口的compareTo()方法
	public int compareTo(Object obj){
		Teacher s = (Teacher) obj;	
		// 定义比较方式,先比较年龄age,再比较名称name     
		if(this.age -s.age > 0) {		
				return 1;
		}
		if(this.age -s.age == 0) {		
			return this.name.compareTo(s.name);	
		}
		return -1;
	}
}
public class Example12 {
	public static void main(String[] args) {
		TreeSet ts = new TreeSet();               
		ts.add(new Teacher("Jack",19));           
		ts.add(new Teacher("Rose",18));
		ts.add(new Teacher("Tom", 19));
		ts.add(new Teacher("Rose",18));
		System.out.println(ts);
	}
}

这段代码也可以去重

 

Compares this object with the specified object for order. Returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object.

将此对象与指定对象进行比较以确定顺序。返回一个负整数、零或正整数,因为该对象小于、等于或大于指定的对象。

你看看Comparable里面的方法的注释

按你的意思, 你应该重写equals,下面的代码经过我的测试没问题

package com.xm.officialaccounts.entity;

import java.util.TreeSet;
class Stu implements Comparable{
    String id;
    String name;
    int score;

    public Stu(String id, String name, int score) {
        this.id = id;
        this.name = name;
        this.score = score;
    }

    @Override
    public String toString() {
        return id + ":" + name + ":" + score;
    }

    @Override
    public boolean equals(Object obj){
        Stu st = (Stu)obj;
        return id.equals(st.id);
    }

    @Override
    public int compareTo(Object o) {
        // 这个是用来排序的
        // a negative integer, zero, or a positive integer
        // as this object is less than, equal to, or greater than the specified object.
        Stu st = (Stu)o;
        return id.compareTo(st.id);
    }

    public static void main(String[] args) {
        TreeSet<Stu> ts = new TreeSet<>();
        ts.add(new Stu("001", "Mike", 100));
        ts.add(new Stu("002", "Jack", 400));
        ts.add(new Stu("002", "Tom", 300));
        ts.add(new Stu("004", "Rose", 400));
        System.out.println(ts);
    }
}

[001:Mike:100, 002:Jack:400, 004:Rose:400]
 

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632