Java TreeSet集合排序 && 定义一个类实现Comparator接口,覆盖compare方法 && 按照字符串长度排序

package TreeSetTest;

import java.util.Iterator;
import java.util.TreeSet;

import javax.management.RuntimeErrorException;

/*
可以对set集合中的元素进行排序,其底层的数据结构是二叉树,
保证元素唯一性的依据是compareTo和return 0;

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

TreeSet排序的第二种方式
当元素自身不具备比较性时,或者具备的比较性不是所需的
这时就需要让集合自身具备比较性
在集合初始化时,就有了比较方式

记住:当比较时,如果主要条件相同,就比较次要条件
*/

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("不是学生对象");
		}
		Student s = (Student)obj;
		// System.out.println(this.name+"=====Compare====="+this.age);
		if (this.age >s.age)
		{
			return 1;
		}
		else if (this.age == s.age) {
			// 如果年龄相同比较姓名
			return this.name.compareTo(s.name);
		}
		else {
			return -1;
		}

		*/
		return -1;
	}

	public String getname()
	{
		return this.name;
	}

	public int getage()
	{
		return age;
	}
}

public class TreeSetDemo
{
	public static void main(String[] args)
	{
		TreeSet<Student> tsSet =new TreeSet<Student>();

		tsSet.add(new Student("as", 12));
		tsSet.add(new Student("fvhgj",45));
		tsSet.add(new Student("ert", 15));
		tsSet.add(new Student("wenjia", 31));
		tsSet.add(new Student("wejia", 1));

		Iterator<Student> iterator = tsSet.iterator();

		while (iterator.hasNext())
		{
			Student stu = (Student)iterator.next();
			System.out.println(stu.getage()+"======"+stu.getname());
		}
	}
}

////////////////////////////////////////////
////////////////////////////////////////////
package TreeSetTest;

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

/*
	当元素自身不具备比较性,或者具备的比较性不是所需要的。
	这时需要让容器自身具备比较性。
	定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

	当两种排序都存在时,一比较器为主

	定义一个类,实现Comparator接口,覆盖compare方法
	二叉树都是以 return 0;判断元素是否相等
*/

public class TreeSetDemoTwo
{
	public static void main(String[] args)
	{
		TreeSet<Student> tsSet = new TreeSet<Student>(new MyCompare());

		tsSet.add(new Student("wenjai10", 29));
		tsSet.add(new Student("wenjai11", 28));
		tsSet.add(new Student("wenjai12", 27));
		tsSet.add(new Student("wenjai13", 26));
		tsSet.add(new Student("wenjai11", 21));

		Iterator<Student> it = tsSet.iterator();
		while (it.hasNext())
		{
			Student student = (Student) it.next();
			System.out.println(student.getname()+"======"+student.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;
	}
}

///////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
package TreeSetTest;

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

/*
练习: 按照字符串长度排序

字符串本身具有比较性,但是它的比较方式不是所需的

这时就只能用比较器
*/

public class TreeSetPractice_One
{

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

		ts.add("asd");
		ts.add("bb");
		ts.add("ba");
		ts.add("ityior");
		ts.add("hysdhbgg");

		Iterator<String> it = ts.iterator();
		for (String string : ts)
		{
			System.out.println(string);
		}
	}
}

class stringLenCompare implements Comparator
{
	@Override
	public int compare(Object o1, Object o2)
	{
		// TODO Auto-generated method stub
		String str1 = (String)o1;
		String str2 = (String)o2;

		/*
		if (str1.length()>str2.length())
		{
			return 1;
		}
		if(str1.length() == str2.length())
		{
			return 0;
		}
		*/
		int num = new Integer(str1.length()).compareTo(new Integer(str2.length()));
		if (num == 0)
		{
			return str1.compareTo(str2);
		}
		return num;
		// return 0;
	}
}

  

时间: 2024-10-03 22:51:27

Java TreeSet集合排序 && 定义一个类实现Comparator接口,覆盖compare方法 && 按照字符串长度排序的相关文章

黑马程序员——java——TreeSet集合中储存学生对象,按照其年龄进行排序

TreeSet集合中储存学生对象,按照其年龄进行排序 import java.util.Comparator; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.TreeSet; public class SortListDemos { public static void main(String[] args) { // //linkhash

面向对象定义一个类

1定义一个类格式:public class 类名{类体},能编译不能运行类名首字母必须大写,以后每个单词首字母大写2定义属性和声明变量一样格式:属性类型 属性名;,属性名首字母小写以后每个单词首字母大写属性类型可以是任意类型(基本数据类型和引用数据类型,比如String)3.定义方法格式 public void 方法名(参数){语句(方法体)}方法名首字母小写以后每个单词首字母大写 注意事项:类里只能有属性和方法(方法块,代码块),语句必须写到方法里 4.定义对象:类名 对象名 = new 类名

ExtJs--07--Ext.define定义一个类的过程

Ext.onReady(function(){ //Ext定义一个类 Ext.define( "Person", { config:{ name:"jack", age:22 }, fangfa:function(){ Ext.Msg.alert("标题信息","提示内容信息") } , constructor:function(config){ //测试构造器调用没有及参数传递进来没有 // for(var attr in

C#1(.net和C#的关系、VS与.net的对应关系、VS2012常用的几种应用程序、C#定义一个类的方法、类页面内容的解释、定义Person的类、调用Person类的方法、命名规范、数值类型)

1..net和C#的关系 .net是一个开发平台,C#是应用在.net平台上的一种语言.   2.VS与.net的对应关系  3.VS2012常用的几种应用程序 第一种是Windows窗体应用程序,也即是我们常用的C/S端的应用软件: 第二种是控制台应用程序,主要是用来学习调试C#代码的(老师上课应用的模式): 第三种是空Web应用程序,建立空的网页模式,B/S模式: 第四种是Web 窗体应用程序,建立后会生成一些常用的网页组件和功能,例如JS.image等,也是B/S模式. 4.C#定义一个类

类的继承和多态性-编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 getLegs(),设置动物名称的方法 setKind(),获得动物名称的方法 getKind(),获得动物数量的方法 getCount()。定义Fish类,是Animal类的子类,

编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 getLegs(),设置动物名称的方法 setKind(),获得动物名称的方法 getKind(),获得动物数量的方法 getCount().定义Fish类,是Animal类的子类,统计鱼的数量 count,获得鱼数量的方法 getCount().定义Tiger类,是Animal类的子类,统计老虎的

java多线程并发去调用一个类的静态方法安全性探讨

java多线程并发去调用一个类的静态方法安全性探讨 转自:http://blog.csdn.net/weibin_6388/article/details/50750035 这篇文章主要讲多线程对静态方法访问的数据安全性 总结如下: 1,java在执行静态方法时,会在内存中拷贝一份,如果静态方法所在的类里面没有静态的变量,那么线程访问就是安全的,比如在javaee中服务器必然会多线程的处理请求此时如果设计全局需要调用的静态方法,可用此种设计. 2,java在执行静态方法时,如果使用静态变量,同时

定义一个类:实现功能可以返回随机的10个数字,随机的10个字母, 随机的10个字母和数字的组合;字母和数字的范围可以指定,类似(1~100)(A~z)

#习题2:定义一个类:实现功能可以返回随机的10个数字,随机的10个字母, #随机的10个字母和数字的组合:字母和数字的范围可以指定 class RandomString(): #随机数选择的范围作为参数,如(1~100)字母 ('A'~'z'),大写字母在前 按ascii值排列先后 def __init__(self,start_num=0,end_num=100,start_alpha='A',end_alpha='z'): import string if not isinstance(s

Java基础-接口.编写2个接口:InterfaceA和InterfaceB;在接口InterfaceA中有个方法void printCapitalLetter();在接口InterfaceB中有个方法void printLowercaseLetter();然 后写一个类Print实现接口InterfaceA和InterfaceB,要求 方法 实现输出大写英文字母表的功能,printLowerca

#34.编写2个接口:InterfaceA和InterfaceB:在接口InterfaceA中有个方法void printCapitalLetter():在接口InterfaceB中有个方法void printLowercaseLetter():然 后写一个类Print实现接口InterfaceA和InterfaceB,要求      方法 实现输出大写英文字母表的功能,printLowercaseLetter()方法实现输出小写英文 字母表的功能.再写一个主类E,在主类E的main方法中创建P

JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序

一.描述 自定义的类要按照一定的方式进行排序,比如一个Person类要按照年龄进行从小到大排序,比如一个Student类要按照成绩进行由高到低排序. 这里我们采用两种方式,一种是使用Comparable接口:让待排序对象所在的类实现Comparable接口,并重写Comparable接口中的compareTo()方法,缺点是只能按照一种规则排序. 另一种方式是使用Comparator接口:编写多个排序方式类实现Comparator接口,并重写新Comparator接口中的compare()方法,