`
444878909
  • 浏览: 637983 次
文章分类
社区版块
存档分类
最新评论

黑马程序员_<<Set,TreeSet>>

 
阅读更多

--------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------------------


1.TreeSet

1. 概述

TreeSet本身对元素记性排序,要是自定的类,那么要是此类对象存数TreeSet中,那么就必须是S自定义的类本身具备比较性,那么据必须实现接口Comparable,并重写方法compareTo()方法,底层数据结构是二叉树

compareTo()返回值是整数,如果小于0,那么此对象就小于比较的对象,等于0,那么此对象就等于比较的对象,如果大于0,那么此对象就大于比较的对象。

2. 自然排序规则(Comparable)

有的对象在存储到TreeSet本身就具备可比性,例如:String类,是要找ASCII大小比较的,那么我们就以自定义的类来存储TreeSet中,使其具备可比性。


package www.fuxi.jihe;
//自定义的异常
public class RunntimeNoStudentExceptionextends RuntimeException {
    publicRunntimeNoStudentException(String message){
      super(message);
    }
}
 
package www.fuxi.jihe;
 
public class Student implements Comparable {
   private String name;// 姓名
   private int age;// 年龄
  
   public Student(Stringname, int age) {
     super();
     this.name = name;
     this.age = age;
   }
 
   public String getName() {
     return name;
   }
 
   public int getAge() {
     return age;
   }
 
   public int compareTo(Object o) {
     if(!(o instanceof Student))
        throw new RunntimeNoStudentException("不是Student对象");
     Student stu=(Student)o;
     if(this.name.equals(stu.name)){
        return this.age-stu.age;
     }
     return this.name.compareTo(stu.name);
   }
 
}
package www.fuxi.jihe;
 
import java.util.Iterator;
import java.util.TreeSet;
 
public class TreeSetDemo {
   public static void main(String[]args) {
     TreeSet set=new TreeSet();
     set.add(new Student("zhangsan",22));
     set.add(new Student("zhangsan",23));
     set.add(new Student("zhangsan",22));
     set.add(new Student("lisi",25));
     Iterator it=set.iterator();
     while(it.hasNext()){
        Student stu=(Student)it.next();
        System.out.println(stu.getName()+":"+stu.getAge());
     }
   }
 
}
 
结果:
lisi:25
zhangsan:22
zhangsan:23
 


从结果可以看出,如果名字相同,则比较年龄,如果年龄也相同,那么对象就相同了,此不存入此对象。

3. 模拟二叉树

package www.fuxi.jihe;
 
class ErChaShu {
   class Node {
     private Comparable data;
     private Node left;
     private Node right;
 
     public Node(Comparable data) {// 构造方法初始化数据
        this.data = data;
     }
 
     public void addNode(Node newNode) {
        if (newNode.data.compareTo(this.data) < 0) {// 利用compareTo方法比较
          if (this.left == null) {// 判断是否放在左子树
             this.left = newNode;
          } else {
             this.left.addNode(newNode);
          }
        }
        if (newNode.data.compareTo(this.data) >= 0) {// 判断是否放在右子树
          if (this.right == null) {
             this.right = newNode;
          } else {
             this.right.addNode(newNode);
          }
        }
 
     }
 
     public void printNode() {// 输出元素,中序遍历
        if (this.left != null) {
          this.left.printNode();// 输出左子树
        }
        System.out.print(this.data + "\t");
        if (this.right != null) {
          this.right.printNode();
        }
     }
   }
 
   private Node root = null;// 存放根节点
 
   public void add(Comparable com) {// 加入新元素
     Node newNode = new Node(com);// 定义新结点
     if (this.root == null) {
        this.root = newNode;
     } else {
        this.root.addNode(newNode);// 判断是放在左子树还是右子树
     }
   }
 
   public void print() {// 输出新结点
     this.root.printNode();
   }
}
 
public class TextClass {
   public static void main(String[] agrs) throws Exception {
     ErChaShu t = new ErChaShu();
     t.add(4);// 添加元素
     t.add(2);
     t.add(0);
     t.add(7);
     t.add(9);
     t.add(8);
     t.print();// 输出元素
   }
}
 
结果:
0  2  4  7  8  9 


4. 自定义比较器(Comparator)

除了第一种比较方式,自然的排序,是对象本身具备比较性,还有另一种比较方式,那就是使集合具备比较性,那就是自定义比较器,把比较器通过构造方式传给集合,使集合剧本比较性。

步骤:定义一个类,实现接口Comparator,然后重写方法compare方法。

当比较器和自定义的自然排序同时存在的时候,那么就一比较器为主。


public class RunntimeNoStudentException extends RuntimeException {
    publicRunntimeNoStudentException(String message){
      super(message);
    }
}
public class Person {
   private String name;// 姓名
   private int age;// 年龄
 
   public Person(String name, int age) {
     super();
     this.name = name;
     this.age = age;
   }
 
   public String getName() {
     return name;
   }
 
   public int getAge() {
     return age;
   }
 
  
}
import java.util.Comparator;
 
public class MyCompartor implements Comparator {
 
   public int compare(Object o1, Object o2) {//从写此方法
     if(!(o1 instanceof Person || o2 instanceof Person)){
         throw newRunntimeNoStudentException("不是Person对象");
     }
     Person p=(Person)o1;
     Person p1=(Person)o2;
     int num=p.getName().compareTo(p1.getName());
     if(num==0)
        return p.getAge()-p1.getAge();
     return num;
   }
 
}
package www.fuxi.jihe;
 
import java.util.Iterator;
import java.util.TreeSet;
 
public class TreeSetDemo {
   publicstatic void main(String[] args) {
    
     TreeSetset = new TreeSet(new MyCompartor());
     set.add(newPerson("java03", 22));
     set.add(newPerson("java01", 23));
     set.add(newPerson("net07", 22));
     set.add(newPerson("net03", 25));
     Iteratorit = set.iterator();
     while(it.hasNext()) {
        Personstu = (Person) it.next();
        System.out.println(stu.getName()+ ":" + stu.getAge());
     }
   }
 
}
结果:
java01:23
java03:22
net03:25
net07:22
 


从结果可以看出,先是按照名字排序,然后按照年龄排序。

5. 练习

自定义比较器,存储字符串,字符串按照长度大小排序

import java.util.Comparator;
 
public class MyStringCompartor implements Comparator {
 
  public int compare(Object o1, Object o2) {//从写此方法
    if(!(o1 instanceof String|| o2 instanceof String)){
       throw newRunntimeNoStudentException("不是String的子类或者Person对象");
    }
    Strings1=(String)o1;
    Strings2=(String)o2;
    return s1.length()-s2.length();
  }
 
}
importjava.util.Iterator;
importjava.util.TreeSet;
 
publicclass TreeSetDemo {
public static void main(String[] args) {
  
   TreeSet set = new TreeSet(new MyStringCompartor());
   set.add("abcd");
   set.add("ad");
   set.add("cdf");
   set.add("a");
   set.add("abcdfrr");
   Iterator it = set.iterator();
   while (it.hasNext()) {
     System.out.println(it.next());
   }
}
 
}
结果:
a
ad
cdf
abcd
abcdfrr
 
 

--------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------------------

分享到:
评论

相关推荐

    Java中AVL平衡二叉树实现Map_(仿照TreeMap和TreeSet)1

    Java中AVL平衡二叉树实现Map_(仿照TreeMap和TreeSet)1

    Java JDK实例宝典

    &lt;br&gt;第1章 Java基础 &lt;br&gt;1.1 转换基本数据类型 &lt;br&gt;1.2 Java的运算符 &lt;br&gt;1.3 控制程序的流程 &lt;br&gt;1.4 计算阶乘 &lt;br&gt;1.5 实现命令行程序 &lt;br&gt;第2章 Java面向对象程序设计 &lt;br&gt;2. 1 复数类 &lt;br&gt;2. 2 equals.chashCode...

    java集合类学习与实例

    实现类:红色Collection|_____Set(HashSet)| |_____SortedSet(TreeSet)|_____List(LinkedList,ArrayList) Collection:集合层次中的根接口,JDK没有提供这个接口的实现类。Set:不能包含重复的元素,子接口SortedSet是...

    黑马程序员基础测试题答案

    9、 定义一个静态方法,该方法可以接收一个List&lt;Integer&gt;,方法内对List进行排序 10、 声明类Student,包含3个成员变量:name、age、score,创建5个对象装入TreeSet,按照成绩排序输出结果(考虑成绩相同的问题)。

    jsp实验报告.doc

    TreeSet&lt;String&gt;dictionary=new TreeSet&lt;String&gt;(); public void addWord(String s) { String word[] = s.split(" "); for(int i=0;i&lt;word.length;i++) { dictionary.add(word[i]); } } %&gt; &lt;% String str = request...

    java排序代码

    排序: TreeSet支持两种排序方式: 自然排序:TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间大小关系,然后将集合... TreeSet&lt;Object&gt; set = new TreeSet&lt;Object&gt;(new MyTreeSetCompartor());

    ist的matlab代码-uebung08:练习08

    TreeSet&lt;T&gt; ),您可以使用著名人物的示例来计算有关推文的统计信息。 这项任务的目的 首先,逐步将推文( String s)编入索引,以计算哪个单词出现的频率。 基于此统计信息,现在可以创建迭代器以便使用 整个词汇...

    HashSet和TreeSet_围墙之外

    HashSet和TreeSet_围墙之外.rar

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

    Java数据结构--13.Java8数据结构TreeSet 前⾔ ,上⼀篇中对 Set 接⼝最终实现类 HashSet 与 LinkedHashSet 做了介绍与分析,本篇将对另⼀种 Set 接⼝的最终实现类 TreeSet 进⾏ 介绍与分析。 先来看下 TreeSet 完整...

    DataStructureJava:主要数据结构——java中的简单实现

    interface Map&lt;Key&gt; TreeMap&lt;K&gt; HashMap&lt;K&gt; LinkedHashMap&lt;K&gt; Hashtable&lt;K&gt; extends Dictionary&lt;K&gt; - JDK 1.0 接口 Set TreeSet HashSet 树特里================== 问题: 如何使用两个堆栈实现队列? 答案:...

    day05-迭代器,数据结构,List,Set ,TreeSet集合,Collections工具类 - 副本.md

    这是为了方便大家了解集合类的相关知识所找的一个MarkDown文档,读者可以通过阅读了解各种子类集合的实现原理,红黑树的实现也会有所介绍.

    set.list.map接口

    2. 两个实现类HashSet(LinkHashSet)和TreeSet,TreeSet有排序功能(Set set=new TreeSet();set.add(new Integer(8)); set.add(new Integer(4)); set.add(new Integer(7));)输出后的结果是:4 7 8 Eg: package test...

    java编程宝典

    3.3 如何实现一个Set&lt;Student&gt; set = new TreeSet&lt;&gt;(); 12 3.4 如何实现一个Map&lt;Object,List&lt;Object&gt;&gt; map = new HashMap&lt;&gt;(); 13 4线程 14 两种方式的卖票线程 1) 继承 Thread 类,数据无法共享 14 2) 实现 ...

    Class003_TreeSet.java

    Class003_TreeSet.java

    TreeSet 不用自然排序自己做比较器

    Comparator&lt;String&gt; com = new Comparator&lt;String&gt;(){ public int compare(String o1,String o2) { return o1.length()-o2.length(); } }; TreeSet ts = new TreeSet(com); ts.add("string"); ts.add(...

    List,Set练习题(no TreeSet).docx

    List,Set练习题(no TreeSet).docx

    TreeSet集合用法

    介绍TreeSet集合用法,向TreeSet集合中添加类的对象,此类需实现Comparable接口,有实例,供需要的朋友下载学习。

    java 集合框架(TreeSet练习)

    毕向东Java基础视频教程-集合框架(TreeSet练习).

    java泛型 用了treeset

    使用TreeSet和Comparator,编写TreeSetTest2类,要求对TreeSet中的元素1-元素10进行排列,排序逻辑为奇数在前偶数在后,奇数按照升序排列,偶数按照降序排列。 如果需要的话可以下载,有写成文章的。有写了一点中文...

    动力节点_Java基础视频教程124_TreeSet中存储自定义类型对象

    动力节点的Java课程适合绝对零基础的观看,教程中讲解了Java开发环境搭建、Java的基础语法、Java的面向对象。每一个知识点都讲解的非常细腻,由浅入深。适合非计算机专业,想转行做Java开发的朋友,或者想让Java基础...

Global site tag (gtag.js) - Google Analytics