LinkedHashSet和TreeSet

一,LinkedHashSet

哈希表和链表实现的set接口
哈希表决定了它元素是唯一的,而链表则保证了他是有序的(存储和取出顺序一致)

二,TreeSet

元素按照一定规则排序,不是按储存时间排的
具体排序方法由构造方法决定
无参构造TreeSet()故居元素的自然排序进行排序
没有索引无法使用普通for循环进行遍历
也属于set集合,没有重复元素

三,排序

自然排序Comparable通过返回正负数和0判断,返回正数说明前一个比将要储存进来的大,即放到前面
返回的是负数说明前一个比将要储存进来的小,就会放在后面,这样就做到了从小到大排列
返回0他会以为元素一致而不存储
利用以上规则,当实现Comparable接口时,可以重写compareTo()方法,一我们想要的顺序输出
例如:按存储时间直接return 1(正数);,按时间的倒序return -1(负数);
 

Comparator比较器
当使用带参构造时,需要传Comparator接口(实际传得应该是他的实现类对象)
由于匿名内部类就相当于一个接口的实现类所以可以用匿名内部类代替,否则需要写一个接口实现类,然后创建它的对象传进去

最后用复杂一点的比较器练习一下

Student类,当使用无参构造即自然排序时需要实现一下Comparable接口

public class Student {
    public String name;
    public int chinese;
    public int math;
    public Student(){}
    public Student(String name,int chinese,int math){
        this.chinese=chinese;
        this.name=name;
        this.math=math;
    }

    @Override
    public String toString() {
        return "名字:"+name+" "+"语文:"+chinese+" "+"数学:"+math+"\t";
    }
}

测试类

import java.util.Comparator;
import java.util.TreeSet;

public class TreeSetTest {
    public static void main(String[] args) {
//        TreeSet的有参构造,可以写一个Comparabor的实现类然后创建对象传进来,也可以直接写一个匿名内部类,因为他本身相当于接口的一个实现对象
        TreeSet ts=new TreeSet(new Comparator() {
            @Override
            public int compare(Student o1, Student o2) {
//                按照成绩总分从低到高排
                int result=(o1.math+o1.chinese)-(o2.math+o2.chinese);
//                如果总分不同返回i是两个学生对象总成绩的差值,如果总分相同则按姓名排序(compareTo一样的话说明姓名相同,说明两个元素重复,则不会添加进去)
                int i=result==0?o1.name.compareTo(o2.name):result;
                return i;
            }
        });
        Student s1=new Student("小明",88,99);
        Student s2=new Student("小华",87,100);
        Student s3=new Student("小天",86,94);
        Student s4=new Student("小亮",83,89);
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        System.out.println(ts);
    }
}

结果

 

你可能感兴趣的:(java,intellij-idea)