TreeSet和TreeMap的输出

如果加入TreeSet和TreeMap的元素没有实现comprable中的compareTo()方法,那么会报错“treeset cannot be cast to java.lang.Comparable”.

因此需要对元素类型实现comparable借口,并实现compareTo()方法,即告诉TreeSet和TreeMap你要怎么排列,它才能进行排序。

基础类:

package niukewang;

import java.util.Objects;

public class setClass implements Comparable<setClass>{

    String a;
    String b;
    public setClass(String a, String b)
    {
        this.a=a;
        this.b=b;
    }

    public int hashCode() {
        return a.hashCode();
    }

    public boolean equals(Object obj)
    {
        if(obj==null) return false;

        if(getClass() != obj.getClass()) return false;

        final setClass s=(setClass)obj;

        return Objects.equals(this.a, s.a);
    }

    @Override
    public int compareTo(setClass o) {
        int num=this.b.compareTo(o.b);
        return num;
    }
}

测试类:

package niukewang;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.Vector;

public class test1 {

    public static void main(String args[])
    {
        setClass s1=new setClass("http://www.yjbys.com/", "same0");
        setClass s2=new setClass("http://www.yjbys.com1/", "same0");
        setClass s3=new setClass("http://www.yjbys.com2/", "same2");
        setClass s4=new setClass("http://www.yjbys.com2/", "same3");

        //hasSet
        System.out.println("hasSet......");
        Set<setClass> set=new HashSet<setClass>();
        set.add(s1);
        set.add(s2);
        set.add(s3);
        set.add(s4);
        Iterator it= set.iterator();
        while(it.hasNext())
        {
            setClass ob=(setClass)it.next();
            System.out.println(ob.a);
        }

        //TreeSet
        System.out.println("\nTreeSet........");
        Set<setClass> tree=new TreeSet<setClass>();
        tree.add(s1);
        tree.add(s2);
        tree.add(s3);
        tree.add(s4);
        Iterator treeit=tree.iterator();
        while(treeit.hasNext())
        {
            setClass ob=(setClass) treeit.next();
            System.out.println(ob.a);
        }

        //TreeMap
        System.out.println("\nTreeMap.........");
        Map<setClass,String> treemap=new TreeMap<setClass,String>();
        treemap.put(s1, "TreeMap one");
        treemap.put(s2, "TreeMap two");
        treemap.put(s3, "TreeMap three");
        treemap.put(s4, "TreeMap four");
        for(Map.Entry<setClass, String> entry: treemap.entrySet())
        {
            System.out.println("The treemap key is "+entry.getKey().a+" The value is "+ entry.getValue());
        }

        //HasMap
        System.out.println("\nHashMap......");
        Map<setClass,String> hashmap=new HashMap<setClass, String>();
        hashmap.put(s1, "HashMap one");
        hashmap.put(s2, "HashMap two");
        hashmap.put(s3, "HashMap three");
        hashmap.put(s4, "HashMap four");
        for(Map.Entry<setClass, String> entry : hashmap.entrySet())
        {
            System.out.println("The key is "+entry.getKey().a+" The value is "+entry.getValue());
        }

        //HasTable
        System.out.println("\nHashTable......");
        Map<setClass,String> hashtable=new Hashtable<setClass, String>();
        hashtable.put(s1, "HashTable one");
        hashtable.put(s2, "HashTable two");
        hashtable.put(s3, "HashTable three");
        hashtable.put(s4, "HashTable four");
        for(Map.Entry<setClass, String> entry: hashtable.entrySet())
        {
            System.out.println("The HashTable key is "+entry.getKey().a+" The HashTable value is "+entry.getValue());
        }

        //LinkedList
        System.out.println("\nLinkedList.....");
        List list=new LinkedList();
        list.add(s1);
        list.add(s2);
        list.add(s3);
        list.add(s4);
        Iterator listit=list.iterator();
        while(listit.hasNext())
        {
            setClass ob=(setClass)listit.next();
            System.out.println(ob.a);
        }

        //ArrayList
        System.out.println("\nArrayList.....");
        List array=new ArrayList();
        array.add(s1);
        array.add(s2);
        array.add(s3);
        array.add(s4);
        Iterator arrayit=array.iterator();
        while(arrayit.hasNext())
        {
            setClass ob=(setClass)arrayit.next();
            System.out.println(ob.a);
        }

        //vector
        System.out.println("\nvector.....");
        Vector v=new Vector();
        v.add(s1);
        v.add(s2);
        v.add(s3);
        v.add(s4);
        Iterator vit=v.iterator();
        while(vit.hasNext())
        {
            setClass  ob=(setClass)vit.next();
            System.out.println(ob.a);
        }

    }
}

输出结果:

hasSet......
http://www.yjbys.com1/
http://www.yjbys.com/
http://www.yjbys.com2/

TreeSet........
http://www.yjbys.com/
http://www.yjbys.com2/
http://www.yjbys.com2/

TreeMap.........
The treemap key is http://www.yjbys.com/ The value is TreeMap two
The treemap key is http://www.yjbys.com2/ The value is TreeMap three
The treemap key is http://www.yjbys.com2/ The value is TreeMap four

HashMap......
The key is http://www.yjbys.com1/ The value is HashMap two
The key is http://www.yjbys.com/ The value is HashMap one
The key is http://www.yjbys.com2/ The value is HashMap four

HashTable......
The HashTable key is http://www.yjbys.com1/ The HashTable value is HashTable two
The HashTable key is http://www.yjbys.com/ The HashTable value is HashTable one
The HashTable key is http://www.yjbys.com2/ The HashTable value is HashTable four

LinkedList.....
http://www.yjbys.com/
http://www.yjbys.com1/
http://www.yjbys.com2/
http://www.yjbys.com2/

ArrayList.....
http://www.yjbys.com/
http://www.yjbys.com1/
http://www.yjbys.com2/
http://www.yjbys.com2/

vector.....
http://www.yjbys.com/
http://www.yjbys.com1/
http://www.yjbys.com2/
http://www.yjbys.com2/

TreeSet并不像hashSet那样,用hashCode和equals取决于元素是否相等。
而是取决于compareTo()方法中指定的排序的方式;

setClass s1=new setClass("http://www.yjbys.com/", "same0");
  setClass s2=new setClass("http://www.yjbys.com1/", "same0");
  setClass s3=new setClass("http://www.yjbys.com2/", "same2");
  setClass s4=new setClass("http://www.yjbys.com2/", "same3");

如果用hashCode和equals取决于元素是否相等,那么s3和s4是相等的;

而此时候,是根据compareTo()方法中的第二个字符串b来判断是否相等,则s1与s2相等,s3和s4不相等,所以才有这样的输出:

TreeSet........
http://www.yjbys.com/
http://www.yjbys.com2/
http://www.yjbys.com2/

时间: 2024-10-13 23:00:27

TreeSet和TreeMap的输出的相关文章

TreeSet和TreeMap

TreeSet ???TreeSet底层就是一个TreeMap(是一个简化版的TreeMap),当我们使用 TreeSet 的构造方法创建 TreeSet 对象,同时会创建一个TreeMap 对象,当你调用 add 方法向 TreeSet 添加元素,会在 add() 方法中调用 TreeMap 的 put(k,v) 方法. ????添加的元素不允许为null. TreeSet的输出去重.默认升序排序. import java.util.Set; import java.util.TreeSet;

Java 集合类 TreeSet、TreeMap

TreeMap和TreeSet的异同: 相同点: TreeMap和TreeSet都是有序的集合,也就是说他们存储的值都是拍好序的. TreeMap和TreeSet都是非同步集合,因此他们不能在多线程之间共享,不过可以使用方法Collections.synchroinzedMap()来实现同步 运行速度都要比Hash集合慢,他们内部对元素的操作时间复杂度为O(logN),而HashMap/HashSet则为O(1). 不同点: 最主要的区别就是TreeSet和TreeMap非别实现Set和Map接

第40讲:Set、Map、TreeSet、TreeMap操作代码实战

今天来看下set map的操作,让我们从代码出发 val data = mutable.Set.empty[Int] data ++= List(1,2,3)//在空set上加入列表 data += 4//在set上加入新元素 data --= List(2,3) println(data) //Set(1, 4)data += 1println(data)//Set(1, 4),说明Set元素不能重复data.clear() println(data)//Set() 我们可以看出,Set和Li

深入源码分析TreeSet和TreeMap

类似于前面介绍的HashMap和HashSet之间的关系,HashSet底层依赖于HashMap实现,而TreeSet底层则采用一个NavigableMap来保存TreeSet集合的元素.但实际上,由于NavigableMap只是一个接口,因底层依然是使用TreeMap来包含Set集合中的所有元素. 我们观察TreeSet的部分源码: package java.util; public class TreeSet<E> extends AbstractSet<E> implemen

TreeSet与TreeMap浅解

TreeSet与TreeMap的关系: 1.TreeSet 实际上就是用TreeMap来组织数据的,因为在TreeSet中保存了一个NavigableMap<e,Object>接口实例变量,而该接口的实现类就是TreeMap 2.TreeSet与TreeMap都是用二叉树的数据结构来存储数据 3.TreeSet和TreeMap中保存的数据除了Integer和String等有默认顺序的类型外的自定义类型都需要实现Comparable接口并重写compareTo()方法. TreeSet和Tree

线程暂停的方法、基本数据类型包装类、十进制单精度浮点数(32位)存入内存中、TreeSet和TreeMap

使线程暂停执行的方法? 1.Thread类的sleep()方法使线程进入阻塞状态,睡眠指定的时间段. 2.Object类的wait()方法使线程放弃对象锁,进入等锁池,直到获得对象锁后才继续往下执行 3.Thread类的yield()方法平时比较少用,使线程进入就绪状态而不是阻塞状态,也就是说下一个执行的线程可能还是这个线程,当然也可能让给了其他的线程,那么这个线程就暂停了. 4.Java5后的使用Lock接口也可以实现类似于对象锁的功能,优点是比较灵活.可以知道线程获得锁了没有等,比较大的缺点

TreeSet与TreeMap排序

1.TreeSet原理: /* * TreeSet存储对象的时候, 可以排序, 但是需要指定排序的算法 *  * Integer能排序(有默认顺序), String能排序(有默认顺序), 自定义的类存储的时候出现异常(没有顺序) *  * 如果想把自定义类的对象存入TreeSet进行排序, 那么必须实现Comparable接口 *   在类上implement Comparable  *   重写compareTo()方法 *   在方法内定义比较算法, 根据大小关系, 返回正数负数或零 *  

TreeSet和TreeMap不能存放重复元素?能不能存放null?

问题一:本来认为TreeMap不能存放重复元素?其实并非如此: 其实一般情况下是不允许存放重复元素的,但是它并非这么死板,在一些情况下是可以存放重复元素的,存了又会有引入其他问题. 问题二:能不能存放null呢?正常情况下是不能的,会报异常,但是经过一些处理后是可以的. 解答问题一: 1.存放元素时,TreeMap实现外部比较器接口Comparator,并重写其compare方法,当判断元素重复时,强制compare方法返回一个非0的数,就可以将重复元素存入: TreeMap<Integer,S

Java集合Set、Map、HashSet、HashMap、TreeSet、TreeMap等

1.Set和Map的关系: Set代表一种集合元素无序.不可重复的集合,Map代表一种由多个key-value对组成的集合. Set的集合继承体系: Map关系集合 Map集合的key特征:所有key不能重复,key之间没有顺序.Map集合的所有key将具有set集合的特征. 对Set做改造可将Set改造成Map集合: 2.HashSet和HashMap的区别和联系:    对于HashSet,系统采用Hash算法决定集合元素的存储位置:对于HashMap,系统将value当成key的附属物,系