TreeSet()原理及使用

Posted 劲火星空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TreeSet()原理及使用相关的知识,希望对你有一定的参考价值。

1、TreeSet()是使用二叉树的原理对新add()的对象按照指定的顺序排序(升序、降序),每增加一个对象都会进行排序,将对象插入的二叉树指定的位置。

2、Integer和String对象都可以进行默认的TreeSet排序,而自定义类的对象是不可以的,自己定义的类必须实现Comparable接口,并且覆写相应的compareTo()函数,才可以正常使用。

3、在覆写compare()函数时,要返回相应的值才能使TreeSet按照一定的规则来排序(升序,this.对象 < 指定对象的条件下返回-1)

(降序,this.对象 < 指定对象的条件下返回-1)升序是:比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。

实例一:先比较年龄,年龄相同再比较姓名

package Compare;
import java.util.Iterator;  
import java.util.TreeSet;  

public class TreeSetTest 
	public static void main(String args[])
		Persontest per1 = new Persontest("zhangsan", 33);
		Persontest per2 = new Persontest("lisi", 33);
		Persontest per3 = new Persontest("wangwu", 22);
		Persontest per4 = new Persontest("zhaoliu", 44);
		
		TreeSet treeSet=new TreeSet();  
		
		treeSet.add(per1);
		treeSet.add(per2);
		treeSet.add(per3);
		treeSet.add(per4);

        Iterator iterator=treeSet.iterator();  
        while(iterator.hasNext())  
            Persontest t=(Persontest) iterator.next();  
            System.out.println(t.getName()+"的年纪是"+t.getAge());  
          
	


class Persontest implements Comparable
	private String name;
	private int age;
	public void setName(String name)
		this.name = name;
	
	
	public void setAge(int age)
		this.age = age;
	
	
	public String getName()
		return this.name;
	
	
	public int getAge()
		return this.age;
	
	
	public Persontest(String name, int age)
		this.name = name;
		this.age = age;
	
	
	public int compareTo(Object obj)
		Persontest per = (Persontest) obj;
		if(per.age < this.age)
			return -1;
		
		if(per.age > this.age)
			return 1;
		
		if(per.age == this.age)
			return this.name.compareTo(per.name);
		
		return 0;
	


实例二:这个是在Human类中创建了自己的比较器

package Compare;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

// 需要在类中新建一个自己的比较器
public class TreeSetTest2 
	public static void main(String args[])
		
		TreeSet ts = new TreeSet(new Human.Comp());
		ts.add(new Human("zhangsan", 33));
		ts.add(new Human("lii", 44));
		ts.add(new Human("wangwu", 33));
		ts.add(new Human("zhuliu", 55));
		
		Iterator it = ts.iterator();
		while(it.hasNext())
			System.out.println(it.next());
		
	


class Human
	private String name;
	private int age;
	public Human(String name, int age)
		this.name = name;
		this.age = age;
	
	public String toString()
		return "姓名:"+name+" 年龄:"+age;
	
	
	static class Comp implements Comparator
		public int compare(Object ob1, Object ob2)
			Human h1 = (Human)ob1;
			Human h2 = (Human)ob2;
			int result = h1.age > h2.age ? 1 :(h1.age == h2.age ? 0 : -1);
			if(result == 0)
				result = h1.name.compareTo(h2.name);
			
			return result;
		
	 

实例三:利用TreeSet进行字符串中整形子元素的分割和排序

package Sort;
import java.util.Iterator;  
import java.util.TreeSet;  
//将字符串中的 整形数字排序
//如"23,32,22,1,-2,33"排序后输出
public class SortInt1 
	public static void main(String args[])
		SortInt1 sortTest = new SortInt1();
		String str = "33, 34, 77, 4, 56";// 在这里坑了宝宝半天啊,我习惯性的在逗号后边加了空格,结果就是一直报错
		sortTest.SortTest(str);
	
	
	public void SortTest(String str)
		String strary[] = str.split(", "); // 这里也必须加空格才可以
		TreeSet tre = new TreeSet();
		for(int i = 0; i < strary.length; i++)
			tre.add(Integer.parseInt(strary[i]));
		
		// 再将整形数组转化成字符串输出
		Iterator integer = tre.iterator();
		StringBuffer strbuf = new StringBuffer();
		while(integer.hasNext())
			strbuf.append(integer.next()+", ");
		
		strbuf.deleteCharAt(strbuf.length() - 1);
		System.out.println("排序后的整形数组是:"+strbuf.toString());
	

实例四:相对于实例三,排序过程稍微调整

package Sort;
import java.util.Arrays;  
/*
 * 排序方式二
 * 一、将字符串使用split()编程整形数组
 * 二、使用Integer.parseInt()将字符串数组变成整形数组
 * 三、使用Arrays.sort()对整形数组进行排序
 * 四、将排序的好整形数组使用StringBuffer变成整形
 * */
public class SortInt2 
	public static void main(String args[])
		String str = "33, 34, 77, 4, 56";
		SortInt2 sortTest = new SortInt2();
		sortTest.SortTest(str);
	
	
	public void SortTest(String str)
		String strary[] = str.split(", "); //一、将字符串使用split()编程整形数组
		int intary[] = new int [strary.length];
		for(int i = 0; i < strary.length; i++)
			 intary[i] = Integer.parseInt(strary[i]);//二、使用Integer.parseInt()将字符串数组变成整形数组
		
		
		Arrays.sort(intary);//第三、整形数组排序
		StringBuffer strbuf = new StringBuffer();
		for(int j = 0; j < intary.length; j++)
			strbuf.append(intary[j]+", ");
		
		strbuf.delete(strbuf.length() - 2, strbuf.length() - 1);
		System.out.println(strbuf.toString());
	

前两个是TreeSet()的讲解,后两个是字符串通过split()分割成整形,然后再排序

以上是关于TreeSet()原理及使用的主要内容,如果未能解决你的问题,请参考以下文章

java学习之treeset

TreeSet和TreeMap

深入剖析原理!mysql升序排序添加条件

TreeSet

java TreeSet的排序之定制排序

TreeSet的原理是什么?使用需要注意什么?