集合框架_07 _TreeSet

原创 2016年08月20日 19:41:46
/*
Set:无序,不可以重复元素。
	|--HashSet:数据结构是哈希表。线程是非同步的。
				保证元素唯一性的原理:判断元素的hashCode值是否相同。
				如果相同,还会继续判断元素的equals方法,是否为true。

	|--TreeSet:可以对Set集合中的元素进行排序。
				底层数据结构是二叉树。
				保证元素唯一性的依据:
				compareTo方法return 0.

				TreeSet排序的第一种方式:让元素自身具备比较性。
				元素需要实现Comparable接口,覆盖compareTo方法。
				也种方式也成为元素的自然顺序(码表),或者叫做默认顺序。

				TreeSet的第二种排序方式。
				当元素自身不具备比较性时,或者具备的比较性不是所需要的。
				这时就需要让集合自身具备比较性。
				在集合初始化时,就有了比较方式。
需求:
往TreeSet集合中存储自定义对象学生。
想按照学生的年龄进行排序。
记住,排序时,当主要条件相同时,一定判断一下次要条件。
*/
class TreeSetDemo 
{
	public static void main(String[] args) 
	{
		TreeSet ts = new TreeSet();
		ts.add(new Student("lisi02",22));
		ts.add(new Student("lisi007",20));
		ts.add(new Student("lisi09",19));
		ts.add(new Student("lisi08",19));
		//ts.add(new Student("lisi007",20));
		//ts.add(new Student("lisi01",40));

		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)
	{

		//return 0;
		
		if(!(obj instanceof Student))
			throw new RuntimeException("不是学生对象");
		Student s = (Student)obj;

		System.out.println(this.name+"....compareto....."+s.name);
		if(this.age>s.age)
			return 1;
		if(this.age==s.age)
		{
			return this.name.compareTo(s.name);
		}
		return -1;
		/**/
	}
	public String getName()
	{
		return name;

	}
	public int getAge()
	{
		return age;
	}
}


TreeSet比较性,比较年龄

/*
 当元素自身不具备比较性,或者具备的比较性不是所需要的。
 这时需要让容器自身具备比较性。
 定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
 当两种排序都存在时,以比较器为主。
 定义一个类,实现Comparator接口,覆盖compare方法。
 */
class Student2 implements Comparable// 该接口强制让学生具备比较性。
{
	private String name;
	private int age;

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

	public int compareTo(Object obj) {

		// return 0;

		if (!(obj instanceof Student))
			throw new RuntimeException("不是学生对象");
		Student2 s = (Student2) obj;

		// System.out.println(this.name+"....compareto....."+s.name);
		if (this.age > s.age)
			return 1;
		if (this.age == s.age) {
			return this.name.compareTo(s.name);
		}
		return -1;
		/**/
	}

	public String getName() {
		return name;

	}

	public int getAge() {
		return age;
	}
}

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

		ts.add(new Student("lisi02", 22));
		ts.add(new Student("lisi02", 21));
		ts.add(new Student("lisi007", 20));
		ts.add(new Student("lisi09", 19));
		ts.add(new Student("lisi06", 18));
		ts.add(new Student("lisi06", 18));
		ts.add(new Student("lisi007", 29));
		// ts.add(new Student("lisi007",20));
		// ts.add(new Student("lisi01",40));

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

class MyCompare implements Comparator {
	public int compare(Object o1, Object o2) {
		Student s1 = (Student) o1;
		Student s2 = (Student) o2;

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

	}
}

TreeSet排序原理:二叉树


TreeSet比较性之按照字符串长度排序

/*
 练习:按照字符串长度排序。
 字符串本身具备比较性。但是它的比较方式不是所需要的。
 这时就只能使用比较器。
 */
import java.util.*;

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

		ts.add("abcd");
		ts.add("cc");
		ts.add("cba");
		ts.add("aaa");
		ts.add("z");
		ts.add("hahaha");

		Iterator it = ts.iterator();

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

class StrLenComparator implements Comparator {
	public int compare(Object o1, Object o2) {
		String s1 = (String) o1;
		String s2 = (String) o2;

		/*
		 * if(s1.length()>s2.length()) return 1; if(s1.length()==s2.length())
		 * return 0;
		 */

		int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
		if (num == 0)
			return s1.compareTo(s2);

		return num;
	}
}


Tree内置排序功能之将字符串中的数值进行排序

/*
"90 -7 0 18 2 45 4"
将字符串中的数值进行排序。使用TreeSet完成。
思路
1,将字符串切割。
2,可以将这些对象存入TreeSet集合。因为TreeSet自身具备排序功能。
*/
import java.util.*;
class TreeSetTest2 
{
	public static void main(String[] args) 
	{

		ArrayList al = new ArrayList();

		String str = "90 -7 0 18 2 45 4";

		String[] arr = str.split(" ");

		TreeSet ts = new TreeSet();

		for(int x=0; x<arr.length; x++)
		{
			//ts.add(new Integer(arr[x]));
			ts.add(Integer.parseInt(arr[x]));//
		}

		System.out.println(ts);
	}
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

java 集合框架-TreeSet练习

import java.util.*; /* 练习:按照字符串长度排序。 字符串本身具备比较性,但是它的比较方式不是所需要的。这时就只能使用比较器 注意:在方式二中: int num=ne...
  • u011573551
  • u011573551
  • 2016年05月10日 11:27
  • 739

Java集合框架使用场景

不需要唯一用List 需要快速插入、删除元素:用LinkedList 需要快速访问元素:     |–单线程环境:用ArrayList     |–多线程环境:用Vector 需要先进后出的...
  • YEN_CSDN
  • YEN_CSDN
  • 2016年06月14日 10:02
  • 2173

集合框架 - TreeSet

TreeSet是用来对对象元素进行排序的,同时能够保证元素的唯一性. Integer和String等包装类已经默认实现了Comparable接口,所以可以直接添加到TreeSet集合中,而自定义对象要...
  • qfeung
  • qfeung
  • 2017年05月29日 12:41
  • 79

ArrayList与LinkedList、TreeSet与HashSet、HashMap与LinkedHashMap之间的比较

前言:人类一思考,上帝就发笑 之前ArrayList与LinkedList、TreeSet与HashSet、HashMap与LinkedHashMap之间都比较茫然,下面我针对这 几个类具体类来进...
  • wu371894545
  • wu371894545
  • 2016年11月28日 18:08
  • 702

集合框架(TreeSet练习)

练习:按照字符串长度排序 字符串本身具备比较性。但是它的比较方式不是所需要的 这时就只能使用比较器import java.util.*; class TreeSet...
  • shenqingxiaojian
  • shenqingxiaojian
  • 2014年08月01日 09:07
  • 398

集合框架---TreeSet存储自定义对象

/* |---Set:元素是无序的(存入和取出的顺序不一定一致),元素不可以重复。 |---HashSet:底层数据结构是哈希表。 HashSet是如何保证元素唯一性的呢? 是通过元...
  • u012369373
  • u012369373
  • 2015年11月20日 15:19
  • 136

集合框架-TreeSet存储自定义对象

Set:无序,不可以重复元素 |--HashSet:数据结构是哈希表,线程是非同步的 保证元素唯一性的原理:判断元素的hashCode值是否相同 如果相同,还会继续判断元素的equa...
  • shenqingxiaojian
  • shenqingxiaojian
  • 2014年08月01日 09:06
  • 297

集合框架——Set(TreeSet)

import java.util.*; /* Set:无序,不可以重复元素。 |--HashSet:数据结构是哈希表。线程是非同步的。 保证元素唯一性的原理:判断元素的hashCode值是...
  • sinat_37580076
  • sinat_37580076
  • 2017年07月30日 11:18
  • 77

黑马程序员——集合框架(TreeSet)

黑马程序员——集合框架(TreeSet)
  • qq314777895
  • qq314777895
  • 2015年04月01日 15:17
  • 233

Java 集合框架-TreeSet

一、整体代码         TreeSetDemo.java import java.util.*; class Student implements Comparable { priva...
  • jltxgcy
  • jltxgcy
  • 2013年09月02日 15:00
  • 854
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:集合框架_07 _TreeSet
举报原因:
原因补充:

(最多只允许输入30个字)