集合框架_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);
	}
}



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

黑马程序员--07.集合框架--08.【TreeSet的Comparator排序】【TreeSet总结】

集合框架--7       TreeSet的Comparator排序    TreeSet总结 ----------- android培训、java培训、java学习型技术博客、期待与您交流! ---...

黑马程序员--07.集合框架--07.【TreeSet】【TreeSet底层的二叉树】

集合框架--7       TreeSet概述 TreeSet底层的二叉树 ----------- android培训、java培训、java学习型技术博客、期待与您交流! -----------...

Java集合框架之_TreeSet特性

1.向TreeSet中添加是元素必须是同一类型的。否则会报错。  2.可以按照添加进集合中的元素的指定的顺序来遍历;如:String,包装类等默认按照从小到大的顺序遍历  3.当向TreeSet中...
  • XF777
  • XF777
  • 2017年07月30日 22:23
  • 128

Java基础之集合框架(二)--TreeSet、泛型

[java] view plaincopy import java.util.*;      /*  Set:无序,不可以重复元素。      |--HashSe...

集合框架_TreeSet保证元素排序的源码解析

interface Collection{...} interface Set extends Collection{...} interface NavigableMap{} class Tre...

Java基础--集合框架(HashSet、TreeSet、泛型)

Set集合体系Set集合中元素是无序的(存入和取出的顺序不一定一致),元素不可以重复;Set接口常用类 HashSet:底层数据结构是哈希表,线程是非同步的; TreeSet:底层数据结构 是二叉树,...

java 集合框架-TreeSet练习

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

java学习笔记:集合框架之TreeSet

|--------TreeSet  数据结构是二叉树,比较方式很优秀,遍历的速度很快。 TreeSet可以对集合中的元素进行排序: 一、让元素自身具有比较性:   实现Comparable接口...

Java基础---集合框架---迭代器、ListIterator、Vector中枚举、LinkedList、ArrayList、HashSet、TreeSet、二叉树、Comparator

为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。 数组和集合类同是容器,有何不同? 数组虽然也可以...

集合框架——Set(TreeSet)

import java.util.*; /* Set:无序,不可以重复元素。 |--HashSet:数据结构是哈希表。线程是非同步的。 保证元素唯一性的原理:判断元素的hashCode值是...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:集合框架_07 _TreeSet
举报原因:
原因补充:

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