您的位置:首页 > 编程语言 > Java开发

java基础笔记(二--TreeSet)

2015-12-27 21:12 513 查看
Set:无序,元素不可以重复

|——HashSet:数据结构是哈希表。线程是非同步的。

保证元素唯一性的原理:判断元素的hashCode值是否相同。

若相同,会继续判断元素的equals方法是否为true。

|——TreeSet:

特点:可以对Set集合中的元素尽行排序。

TreeSet要求是向里面存的对象必须具备比较性。

底层数据结构是二叉树。

保证元素唯一性的依据:compareTo方法的返回值。

返回1,更大,往右边放(二叉树中);返回0,相等(/比较次要条件);返回-1,更小,往左边放。

20

18 22

16 19 21 23

TreeSet排序的第一种方式:让元素自身具备比较性。

元素需要实现Comparable接口,覆盖compareTo方法。

此种方法也称为元素的自然顺序或默认顺序。

TreeSet的第二种排序方式。

当元素自身不具备比较性或具备的比较性不是所需要的,这时就需要让集合自身具备比较性。

在集合初始化时,就具备比较方式,需参与集合的构造函数部分。

定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

当两种排序都存在时以比较器为主。

定义比较器:定义一个类,实现Comparator接口,覆盖compare方法。

注意:Comparator接口中是compare方法;Comparable接口中是compareTo方法。

import java.util.*;

/*
*需求:
*往TreeSet集合中存储自定义对象学生。
*按照学生年龄进行排序。
*排序时当主要条件相同则判断次要条件。
*/

class TreeSetDemo {
public static void sop(Object obj) {
System.out.println(obj);
}

public static void main(String[] args) {
TreeSet ts = new TreeSet();

/*ts.add("abcd");
ts.add("bcde");
ts.add("cdef");
ts.add("acde");*/
ts.add(new Student("lisi03",21));
ts.add(new Student("lisi04",22));
ts.add(new Student("lisi05",21));
ts.add(new Student("lisi02",20));
ts.add(new Student("lisi01",19));

Iterator it = ts.iterator();

while(it.hasNext()) {
//sop(it.next());

Student stu = (Student)it.next();
sop(stu.getName()+"...."+stu.getAge());
}
}
}

class Student implements Comparable {    //接口Comparable强制让Student类具备比较性
private String name;
private int age;

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

//符合此接口,底层自动会调用
public int compareTo(Object obj) {     //继承接口后需要覆盖方法
if(!(obj instanceof Student))  //首先判断Object是否为Student
throw new RuntimeException("Not Student!");
Student s = (Student)obj; //然后强转

sop(this.name+"...compareto..."+s.name);

if(this.age>s.age)
return 1;
if(this.age==s.age) {
return this.name.compareTo(s.name);
//this.name和s.name均是字符串
//compareTo是String类中的方法,按字典顺序比较两个字符串。
}
return -1;
}

public String getName() {
return name;
}

public int getAge() {
return age;
}

public static void sop(Object obj) {
System.out.println(obj);
}
}


import java.util.*;

/*
*当元素自身不具备比较性或具备的比较性不是所需的,
*需要让容器自身具备比较性。

*定义比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
*/

class TreeSetDemo2 {
public static void sop(Object obj)
{
System.out.println(obj);
}
public static void main(String[] args) {
TreeSet ts = new TreeSet(new MyCompare());

ts.add(new Student("lisi03",21));
ts.add(new Student("lisi02",21));
ts.add(new Student("lisi01",25));
ts.add(new Student("lisi04",23));
ts.add(new Student("lisi01",21));

Iterator it = ts.iterator();
while(it.hasNext()) {
Student stu =(Student)it.next();
System.out.println(stu.getName()+"...."+stu.getAge());
}
}
}

class Student implements Comparable {    //该接口强制的让学生具备比较性
private String name;
private int age;

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

public int compareTo(Object obj) {
if(!(obj instanceof Student))
throw new RuntimeException("Not Student!");

Student s = (Student)obj;

//sop(this.name+"...compareto..."+s.name);

if(this.age>s.age)
return 1;
if(this.age==s.age) {
return this.name.compareTo(s.name);
//compareTo是String类中的方法,按字典顺序比较两个字符串。
}
return -1;
}

public String getName() {
return name;
}

public int getAge() {
return age;
}

public static void sop(Object obj) {
System.out.println(obj);
}
}

class MyCompare implements Comparator {
public int compare(Object o1,Object o2)
{
if(!((o1 instanceof Student)&&(o2 instanceof Student))) {
throw new RuntimeException("Not Student!");
}

Student s1 = (Student)o1;
Student s2 = (Student)o2;

int num = s1.getName().compareTo(s2.getName());
if(num>0)
return 1;
if(num == 0)
//return s1.getAge()-s2.getAge();
return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
return -1;

}
}


import java.util.*;

class TreeSetTest {
public static void sop(Object obj) {
System.out.println(obj);
}
public static void main(String[] args) {
TreeSet ts = new TreeSet(new StrLenComparator());

ts.add("abcde");
ts.add("cc");
ts.add("zya");
ts.add("aaa");
ts.add("hahe");

Iterator it = ts.iterator();

while(it.hasNext()) {
//StrLenComparator slc = (StrLenComparator)it.next();
sop(it.next());
}
}
}

class StrLenComparator implements Comparator {
public int compare(Object o1,Object o2) {
String s1 = (String)o1;
String s2 = (String)o2;
int num = s1.length()-s2.length();
if(num==0)   //当字符串长度相同
return s1.compareTo(s2);
return num;
//return new Integer(s1.length()).compareTo(new Integer(s2.length()));
}
}


import java.util.*;

class TreeSetTest {
public static void sop(Object obj) {
System.out.println(obj);
}
public static void main(String[] args) {
TreeSet ts = new TreeSet(new Comparator() {    //定义成匿名内部类
public int compare(Object o1,Object o2) {
String s1 = (String)o1;
String s2 = (String)o2;
int num = s1.length()-s2.length();
if(num==0)
return s1.compareTo(s2);
return num;
//return new Integer(s1.length()).compareTo(new Integer(s2.length()));
}
}
);

ts.add("abcde");
ts.add("cc");
ts.add("zya");
ts.add("aaa");
ts.add("hahe");

Iterator it = ts.iterator();

while(it.hasNext()) {
//StrLenComparator slc = (StrLenComparator)it.next();
sop(it.next());
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: