`

黑马程序员17-6:TreeSet的Comparator比较器接口以及compareTo优化写法

 
阅读更多

------- android培训 java培训、期待与您交流!-------




package cn.itcast.p.bean;

import java.util.ArrayList;
import java.util.Iterator;


public class Person /*extends Object*/ implements Comparable {

	public static void main(String []augs){
//		Person p = new Person("p1",3);
		ArrayList al = new ArrayList();
		al.add(new Person("p1",3));
		al.add(new Person("p2",2));
		al.add(new Person("p3",3));
		al.add(new Person("p4",4));
		al.add(new Person("p5",5));
		
		Iterator it = al.iterator();
		while(it.hasNext()){
			Person p = (Person) it.next();
			System.out.println(p.getName() + " " + p.getAge());
		}

	}
	
	
	private String name;
	private int age;
	
	
	public Person() {
		super();
		
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	
	
	@Override
	public int hashCode() {
//		System.out.println(this+".......hashCode");
		
		return name.hashCode()+age*37;
//		return 100;
	}
	@Override
	public boolean equals(Object obj) {
		
		if(this == obj)
			return true;
		//健壮性判断
		if(!(obj instanceof Person))
			throw new ClassCastException("类型错误");
		
//		System.out.println(this+"....equals....."+obj);
		Person p = (Person)obj;
		
		
		
		return this.name.equals(p.name) && this.age == p.age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String toString(){
		return name+":"+age;
	}
	//在TreeSet里边进行排序比较,需要重写这个方法
	@Override
	public int compareTo(Object o) {
		
		//要做健壮性判断
		if(!(o instanceof Person)){
			throw new ClassCastException("类型不匹配异常");
		}
		Person p = (Person)o;
		
		int  temp = this.age-p.age;
		return temp==0?this.name.compareTo(p.name):temp;
		
//		int  temp = this.name.compareTo(p.name);
//		return temp==0?this.age-p.age:temp;
		
		/*
		if(this.age>p.age)
			return 1;
		if(this.age<p.age)
			return -1;	
		
		else{
			
			return this.name.compareTo(p.name);
		}
		*/
		
	}
	
}



package cn.itcast.p5.treeset.demo;

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

import cn.itcast.p.bean.Person;
import cn.itcast.p5.comparator.ComparatorByName;

public class TreeSetDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		TreeSet ts = new TreeSet(new ComparatorByName());
		
		/*
		 * ��Person����������д�С���������
		 * 
		 */
		
		ts.add(new Person("zhangsan",28));
		ts.add(new Person("lisi",21));
		ts.add(new Person("zhouqi",29));
		ts.add(new Person("zhaoliu",25));
		ts.add(new Person("wangu",24));
		
		Iterator it = ts.iterator();
		
		while(it.hasNext()){
			Person p = (Person)it.next();
			
			System.out.println(p.getName()+":"+p.getAge());
		}
	
	}



	/**
	 * 
	 */
	public static void demo1() {
		TreeSet ts = new TreeSet();
		
		ts.add("abc");
		ts.add("zaa");
		ts.add("aa");
		ts.add("nba");
		ts.add("cba");
		
		Iterator it = ts.iterator();
		
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}

}


package cn.itcast.p5.comparator;

import java.util.Comparator;

import cn.itcast.p.bean.Person;
/**
 * ������һ�����Person���name��������ıȽ�����
 */
public class ComparatorByName implements Comparator {

	@Override
	public int compare(Object o1, Object o2) {

		Person p1 = (Person)o1;
		Person p2 = (Person)o2;
		//比较姓名(compareTO,就是按字典比较顺序比较字符串大小,也就是比较名字字符串的大小)
		int temp = p1.getName().compareTo(p2.getName());
		//如果名字相同,则继续比较年龄
		return temp==0?p1.getAge()-p2.getAge(): temp;
//		return 1;//����
	}

}


package cn.itcast.p5.comparator;

import java.util.Comparator;

public class ComparatorByLength implements Comparator {

	@Override
	public int compare(Object o1, Object o2) {
		String s1 = (String)o1;
		String s2 = (String)o2;
		//比较对象(字符串)的长度,也就是有多少个
		int temp = s1.length()-s2.length();
		System.out.println("s1: " + s1 + "    " + "s2: "+  s2 + "  ");
		//当长度相等的时候,再比较内容,也就是哪个大
		return temp==0? s1.compareTo(s2): temp;
	}

}



package cn.itcast.p5.treeset.test;

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

import cn.itcast.p5.comparator.ComparatorByLength;

/* 
 * ���ַ���г�������
 * 
 * "20 18 -1 89 2 67"
 */

public class TreeSetTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		TreeSet ts = new TreeSet(new ComparatorByLength());

		ts.add("aaaaa");
		ts.add("zz");
		ts.add("nbaq");
		ts.add("cba");
		ts.add("abc");
		
		Iterator it = ts.iterator();
		
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}

}




TreeSet是按自定义或者默认比较器进行排序的元素唯一的集合。
使用TreeSet

|--TreeSet:可以对Set集合中的元素进行排序。是不同步的。
  判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0,就是相同元素,不存。
TreeSet对元素进行排序的方式一:
  让元素自身具备比较功能,元就需要实现Comparable接口。覆盖compareTo方法。
  如果不要按照对象中具备的自然顺序进行排序。如果对象中不具备自然顺序。怎么办?
可以使用TreeSet集合第二种排序方式二:
     让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法。将该类对象作为参数传递给TreeSet集合的构造函数。




------- android培训 java培训、期待与您交流!-------


详细请查看:http://edu.csdn.net/heima -------
分享到:
评论

相关推荐

    【IT十八掌徐培成】Java基础第12天-02.TreeSet实现与Comparable接口.zip

    本课程重点讲解了`TreeSet`如何实现`Comparable`接口以及如何自定义比较规则。 首先,我们来了解`TreeSet`的基本概念。`TreeSet`内部使用红黑树数据结构存储元素,这使得它的插入、删除和查找操作具有较高的效率,...

    cpu-manager:Java:使用Comparator接口管理记录

    在Java编程中,`Comparator`接口是一个非常重要的工具,它允许我们自定义对象的排序规则。在"cpu-manager"项目中...通过对这些文件的学习和研究,开发者可以更好地掌握Java中的比较器机制,并将其应用到自己的项目中。

    java排序代码

    定制排序:在创建TreeSet集合对象时,并提供一个Comparator接口实现类对象与该TreeSet集合关联, 由Comparator实现类对象负责集合元素的排序逻辑。 // 自定义比较器 class MyTreeSetCompartor implements...

    List对象集合的排序:比较器Comparator(简单例子)

    `Comparator`不仅可以用于`List`的排序,还可以在其他需要比较元素的场景中发挥作用,如`TreeSet`、`PriorityQueue`以及`Arrays.sort()`等。此外,`Comparator`还支持链式调用,可以同时比较多个属性,比如先比较...

    对比Java中的Comparable排序接口和Comparator比较器接口

    Comparator是一个比较器接口,它提供了一种在类本身不支持排序的情况下控制对象次序的方式。通过实现Comparator接口,你可以创建一个独立于原始类的比较逻辑,这使得排序更灵活。Comparator接口包含两个方法:`...

    java 集合框架(TreeSet练习)

    2. **自定义比较器**:如果我们需要自定义元素的排序规则,可以通过传递一个实现了`Comparator`接口的对象给`TreeSet`的构造函数来实现。`compare()`方法在这个比较器中定义了元素的比较逻辑。 3. **基本操作**:`...

    Java数据结构--13.Java8数据结构TreeSet.pdf

    无参构造器创建按元素自然排序的空集合,接受Comparator的构造器创建按指定比较器排序的空集合,接受Collection参数的构造器创建包含给定元素的新集合,并按元素自然排序,以及接受SortedSet参数的构造器创建与输入...

    490.488.JAVA基础教程_常用类-Java比较器概述(490).rar

    3. **比较器的使用场景**:在集合框架如`Collections.sort()`和`TreeSet`等需要排序的地方,以及自定义排序规则时,我们通常会用到`Comparator`。例如,当我们需要根据年龄而非名字对人员列表进行排序时,可以创建一...

    TreeSet判断重复元素解析及代码示例

    `TreeSet`保证了其元素按照自然顺序或者自定义比较器的顺序进行排序。在`TreeSet`中,元素的唯一性是由`compareTo()`方法决定的,而不是`equals()`。 `equals()`方法是Java对象默认继承自`Object`类的方法,用于...

    学习笔记 java\CoreJava笔记\CoreJava_day12

    6. **TreeSet构造函数**:接受Comparator对象,可以根据指定的比较器进行排序。 7. **红黑树**:TreeSet的底层数据结构,一种自平衡的二叉搜索树,保证了操作的时间复杂度。 8. **匿名内部类**:在实际开发中,我们...

    Java中Comparable和Comparator 2种实现方式学习

    在Java编程语言中,排序是常见的操作,而`Comparable`和`Comparator`接口则是实现对象排序的两种主要方式。这篇文章将深入探讨这两种实现方式及其在实际编程中的应用。 首先,`Comparable`接口位于`java.lang`包下...

    Java集合框架全景:深入理解主要接口和类

    - **PriorityQueue**:根据元素的自然顺序或提供的比较器来决定优先级。适用于需要按照特定顺序处理元素的情况。 **示例代码**: ```java Queue&lt;String&gt; queue = new LinkedList(); queue.offer("Apple"); queue....

    java面试宝典

    **6. short s1 = 1; s1 = s1 + 1;会怎么样?short s1 = 1; s1 += 1;又会怎么样?** - **s1 = s1 + 1:** 会导致编译错误,因为s1 + 1的结果是int类型。 - **s1 += 1:** 正常运行,+=操作符会自动进行类型转换。 **7....

    关于集合框架的逻辑知识点图

    1. **Iterable接口**:这是所有集合类的顶级接口,它定义了迭代器的获取方法`iterator()`,使得可以通过迭代器遍历集合中的元素。 2. **Collection接口**:这是集合框架的基本接口,它继承自Iterable接口,定义了...

    2021-2022计算机二级等级考试试题及答案No.3786.docx

    - **TreeSet:** TreeSet是Java集合框架的一部分,实现了SortedSet接口,可以按照元素的自然顺序或自定义比较器排序。 - **Comparable接口:** 实现此接口的类具有自然排序(即按其固有的顺序排序)的概念。为了使一...

    新建文本文档复习.txt

    所有元素都会按照某种顺序进行排列,可以自然排序,也可以自定义比较器进行排序。 - **排序与去重**:与 `HashSet` 类似,`TreeSet` 同样可以保证集合中元素的唯一性,但它还可以保持元素的排序。对于 `Person` 对象...

    java基础。doc

    - **Comparable**:接口定义了compareTo()方法,用于比较对象之间的大小。 - **Comparator**:接口定义了compare()方法,可以自定义比较规则。 #### 17. HashSet与TreeSet的区别 - **HashSet**:使用哈希表实现,...

    在TreeSet中添加自定义对象

    通过这种方式,我们可以直接将`Person1`对象添加到`TreeSet`中,而不需要额外的比较器。 ```java public class testit { public static void main(String[] args) { TreeSet&lt;Person1&gt; ts = new TreeSet(); ts....

    Java习题六.docx

    1. 在创建 TreeSet 对象时,可以传入自定义比较器,自定义比较器需实现 Comparator 接口。 知识点:TreeSet 是一种排序的 Set 集合,可以根据compareTo 方法或自定义的比较器来排序。 2. 使用 Iterator 遍历集合时...

    Java集合框架.pdf

    - **Comparator接口**:用于自定义比较规则,可以在不修改原始类的情况下,创建比较器对Map或集合中的元素进行排序。 9. **集合框架面试题** 面试题可能涵盖集合的使用场景、性能比较、遍历方法、并发处理、排序...

Global site tag (gtag.js) - Google Analytics