Java Collection中 List 与 Set,TreeSet排序方法

Collection

  • List 元素有序排列,元素可以重复,因为存在索引。
    • ArrayList :底层的数据结构使用的是数组结构:查询速度很快 ,增删慢,线程不同步。
    • LinkedList : 底层使用的数据结构是链表结构:增删速度快,查询慢,线程不同步。
    • Vector : 底层使用数组结构,线程同步,效率低,已经被ArrayList替代。
  • Set:元素无序,元素不可重复。

    • HashSet : 数据结构是哈希表,线程非同步。
    • TreeSet : 可以对Set集合中的元素进行排序;底层数据结构是二叉树。保证元素唯一性的依据:CompareTo return 0。return 1时,可使结构按照输入结构保存。
  • ArrayList 判断元素是否相同,只使用equals方法,若对象中没有指定equals方法,则使用父类的equals方法,Object的equals方法比较地址值。因此比较ArrayList中的对象是否相同时,需要重写equals方法,指定要比较的量。

  • HashSet判断元素是否存在,以及删除等操作,方法是元素的hashcode和equals方法;
    如果元素的hashcode值相同,才会判断equals是否相同;
    如果元素的hashcode值不同,不再调用equals方法。

  • TreeSet 不判断hash值,让元素自身具备比较性,删除查找等操作都使用CompareTo方法,默认使用自然顺序排序。

  • 当元素自身不具备比较性时,使集合具备比较性

TreeSet:

  • TreeSet存储对象的时候, 可以排序, 但是需要指定排序的算法
  • Integer能排序(有默认顺序), String能排序(有默认顺序), 自定义的类存储的时候出现异常(没有顺序)
  • 如果想把自定义类的对象存入TreeSet进行排序, 那么必须实现Comparable接口
    1、在类上implement Comparable
    2、重写compareTo()方法
    3、在方法内定义比较算法, 根据大小关系, 返回正数负数或零
  • 在使用TreeSet存储对象的时候, add()方法内部就会自动调用compareTo()方法进行比较, 根据比较结果使用二叉树形式进行存储

Set:

  • add方法:
    • add()返回布尔类型值,当元素已经存在是返回false,则不再进行存储,元素不存在时返回true,进行存储;
    • 遍历结果输出无序;
public static void main(String[] args) {

        HashSet hs = new HashSet();

        hs.add("java1");
        hs.add("java2");
        hs.add("java3");
        hs.add("java4");
        System.out.println(hs.add("java4"));

        Iterator it =hs.iterator();

        while (it.hasNext()){
            System.out.println(it.next());
        }
    }

输出结果:

false
java1
java3
java2
java4

String Int等类型已经实现了CompareTo方法,可以直接调用;


TreeSet 排序方式

  1. 自然排序:对需要添加到set集合中的元素实现Comparable接口进行排序。 TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间大小关系,然后将集合元素按升序排列,这种方式就是自然排序。(比较的前提:两个对象的类型相同)。

  2. 通过Comparator接口指定比较器进行排序; 如果需要实现定制排序,则需要在创建TreeSet集合对象时,并提供一个Comparator对象与该TreeSet集合关联,由该Comparator对象负责集合元素的排序逻辑。

Comparator排序如果需要更改排序方法,直接指定其他的比较器就可完成;

TreeSet优先使用Comparator进行排序,默认使用Comparable接口排序;

如果试图把一个对象添加进TreeSet时,则该对象的类必须实现Comparable接口,必须指定对象的排序方法,主排序条件和次排序条件的排序实现;

自然排序 Comparable:

    public static void main(String[] args) {

        TreeSet ts =new TreeSet();

        ts.add(new Person("user1",25));
        ts.add(new Person("user2",21));
        ts.add(new Person("user8",22));
        ts.add(new Person("user4",22));

        Iterator it = ts.iterator();

        while (it.hasNext()){

            Person p = (Person)it.next();
            System.out.println(p.getName()+"---"+p.getAge());
        }
    }

运行结果:

user2---21
user4---22
user8---22
user1---25

实现Comparable接口,定义compareTo(Object obj)方法

Java Collection中 List 与 Set,TreeSet排序方法_第1张图片

class Person implements Comparable
{
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

//对Person对象先比较age,age
//age相同的情况比较name;

    public int compareTo(Object obj){

        Person p = (Person)obj;

        if (this.age>p.age) {
            return 1;
        }

        if (this.age==p.age) {

            return this.name.compareTo(p.name);
        }
        return -1;

    }



    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

//重写equals方法,对 对象进行判断是否元素相同
    @Override

    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Person person = (Person) o;

        return this.name.equals(person.name) && this.age == person.age;

    }


}

比较器排序:

public class TreeSetSDemo2 {

    public static void main(String[] args) {

        TreeSet ts =new TreeSet(new MyCompare());

        ts.add(new Person("user11",25));
        ts.add(new Person("user2",21));
        ts.add(new Person("user8",22));
        ts.add(new Person("user421",22));


        Iterator it = ts.iterator();

        while (it.hasNext()){

            Person p = (Person) it.next();
            System.out.println(p.getName()+"--"+p.getAge());
        }
    }

}

class MyCompare implements Comparator{

    public int compare(Object o1,Object o2){

        Person p1 = (Person) o1;
        Person p2 = (Person) o2;

        Integer num1 = p1.getAge();
        Integer num2 = p2.getAge();

        Integer num = num1.compareTo(num2);

        if (num == 0) {
            return p1.compareTo(p2);
        }

        return num;
    }
}

你可能感兴趣的:(Java)