集合框架_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练习

TreeSet练习

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

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

集合框架——Set(TreeSet)

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

java 集合框架-TreeSet练习

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

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

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

Java集合框架总结(3)——TreeSet类的排序问题

Java集合框架总结(3)——TreeSet类的排序问题   TreeSet支持两种排序方法:自然排序和定制排序。TreeSet默认采用自然排序。   1、自然排序     Tr...

黑马程序员------TreeSet集合框架存储自定义元素之排序Comparable与Comparator

------- android培训、java培训、期待与您交流! ---------- TreeSet集合框架存储自定义元素之排序Comparable与Comparator 我们知道,往TreeSe...

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

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

java集合框架之TreeSet类

1.TreeSet介绍 TreeSet集合底层采用红黑树算法,会对存储的元素默认使用自然排序(从小到大). 注意: 必须保证TreeSet集合中的元素对象是相同的数据类型,否则报错. ...

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

|--------TreeSet  数据结构是二叉树,比较方式很优秀,遍历的速度很快。 TreeSet可以对集合中的元素进行排序: 一、让元素自身具有比较性:   实现Comparable接口...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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