A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨习平 中级黑马   /  2012-9-7 11:24  /  2388 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.Map.Entry;

public class TreeMapTest {
        @SuppressWarnings("unchecked")
        public static void main(String[] args) {
               Map<Mouse,Cat>  map=new TreeMap<Mouse,Cat>();
                Cat cat1=new Cat("234", 23);
                Cat cat2=new  Cat("322", 12);
               Mouse mou1=new  Mouse("ww", 43);
               Mouse mou2=new Mouse("fw", 23);
               map.put(mou1, cat1);
               map.put(mou2, cat2);
               Set<Entry<Mouse, Cat>> kets=map.entrySet();
               Iterator<Entry<Mouse, Cat>> it=kets.iterator();
               while(it.hasNext()){
                       Mouse ca=(Mouse) it.next();
                       Cat ss= map.get(ca);
                       System.out.println(ss+"****"+ca);
           
                                 }
                                 
                        }
                             
                  
}

class Mouse{
        private String name;
        private int age;

       
    Mouse(String name,int age){
                this.name=name; this.age=age;
                }
        public void getSong(String belongid){
                System.out.println("被猫咪咬过之后老鼠的声音是"+belongid);
        }
        public void setName(String name){
                this.name=name;
        }
        public String getName(){
                return name;
        }
        public void setAge(int age){
                this.age=age;
        }
        public int getAge(){
                return age;
        }
        @Override
        public String toString() {
                // TODO Auto-generated method stub
                return name+","+age;
        }
}
class Cat {
         String name;
       int age;
        Cat(String name,int age)
           {
                this.name=name;
                this.age=age;
                }
public void Animal(String name,int age){
                this.name=name;
                this.age=age;

        }
        public void getSong(String name,int age){
                System.out.println(name+"的年龄"+age+",他的叫声是这个声音还行吧!");
               
        }
        public void setName(String name){
                this.name=name;
        }
        public String getName(){
                return name;
        }
        public void setAge(int age){
                this.age=age;
        }
        public int getAge(){
                return age;
        }

        @Override
        public String toString() {
                // TODO Auto-generated method stub
                return name+","+age;
        }
}
我是想把自定义的两个类传给Map,然后将实例化后的四个对象put给map,但是怎么也编译不出来啊,
我标记的红色部分不知道写的对不对,自己处理不了,求高手。。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 细节问题一定要多注意啊

查看全部评分

6 个回复

倒序浏览
Set<Map.Entry<K,V>>       entrySet() 方法返回的是Map.Entry型的集合,书写正确!
Iterator<Map.Entry<Mouse, Cat>> it=kets.iterator();
这个泛型里面不是指明了是"Map.Entry<Mouse, Cat>"型吗?说明他输出的每一个元素是一个"Map.Entry<Mouse, Cat>"而Mouse和Cat是Map.Entry里的一对映射.要想使用,这对值.可通过Map.Entry中的方法取出,getKey()和getValue()!

Set<Map.Entry<Mouse, Cat>> kets=map.entrySet();
               Iterator<Map.Entry<Mouse, Cat>> it=kets.iterator();
               while(it.hasNext()){
                       Map.Entry<Mouse, Cat>  me= it.next();
                     Cat ss=  me.getValue();
                    Mouse ca=me.getKey();
                  System.out.println(ss+"****"+ca);            
                                 }
                                 
                        }

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 超级版主也来回答问题啦,巨给力!.

查看全部评分

回复 使用道具 举报
1 TreeMap对象的value所存放的对象必须要实现Comparable接口,也就是说你的Cat类必须实现Comparable接口.
2 Iterator中存放的是Entry<Mouse, Cat>类型的数据,那么每调用一次next()方法,所返回的结果都需要用Entry<Mouse, Cat>类型的变量来接收.
现在是给你修改后的代码:
  1. public static void main(String[] args) {
  2.                 // 由于TreeMap要求放在value位置的类,必须要实现Comparable接口,所以这里我就用HashMap了.
  3.                 Map<Mouse, Cat> map = new HashMap<Mouse, Cat>();

  4.                 Cat cat1 = new Cat("234", 23);
  5.                 Cat cat2 = new Cat("322", 12);
  6.                 Mouse mou1 = new Mouse("ww", 43);
  7.                 Mouse mou2 = new Mouse("fw", 23);
  8.                 map.put(mou1, cat1);
  9.                 map.put(mou2, cat2);
  10.                 Set<Entry<Mouse, Cat>> kets = map.entrySet();

  11.                 // Iterator中存放的是Entry<Mouse, Cat>类型的数据,那么每调用一次next()方法,
  12.                 // 所返回的结果都需要用Entry<Mouse, Cat>类型的变量来接收.
  13.                 Iterator<Entry<Mouse, Cat>> it = kets.iterator();
  14.                 Entry<Mouse, Cat> next = null;

  15.                 while (it.hasNext()) {
  16.                         next = it.next();

  17.                         // 通过getKey()方法和getValue()方法直接取得Map中的key与value的内容.
  18.                         System.out.println(next.getKey() + "****" + next.getValue());
  19.                 }
  20.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
有两处错误,
第一处是:使用了TreeMap集合,却没有实现Comparable接口,重写compareTo 方法。
第二处是:红色的部分,Mouse ca=(Mouse) it.next();
                       Cat ss= map.get(ca);
使用的是entrySet();取出的是元素之间的关系,应该是
Entry<Mouse,Cat> me = it.next();
Mouse ca =me.getKey();
Cat ss = me.getValue();

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  1. import java.util.Iterator;
  2. import java.util.Map;
  3. import java.util.Set;
  4. import java.util.TreeMap;
  5. import java.util.Map.Entry;

  6. public class TreeMapTest {
  7.         @SuppressWarnings("unchecked")
  8.         public static void main(String[] args) {
  9.                Map<Mouse,Cat>  map=new TreeMap<Mouse,Cat>();
  10.                Cat cat1=new Cat("234", 23);
  11.                Cat cat2=new  Cat("322", 12);
  12.                Mouse mou1=new  Mouse("ww", 43);
  13.                Mouse mou2=new Mouse("fw", 23);
  14.                map.put(mou1, cat1);
  15.                map.put(mou2, cat2);
  16.                Set<Entry<Mouse, Cat>> kets=map.entrySet();
  17.                Iterator<Entry<Mouse, Cat>> it=kets.iterator();
  18.                while(it.hasNext()){
  19.                        //Mouse ca=(Mouse) it.next();
  20.                        //Cat ss= map.get(ca);
  21.                        //System.out.println(ss+"****"+ca);
  22.                        
  23.                     //这里的代码修改如下:
  24.                                Entry<Mouse,Cat> en = it.next();       
  25.                     Mouse m = en.getKey();
  26.                     Cat c = en.getValue();
  27.                     System.out.println(m+"*****"+c);         
  28.                                 }
  29.                                  
  30.                 }
  31.                              
  32.                   
  33. }

  34. class Mouse implements Comparable{                        //这里Mouse类要具有比较性,因此继承Comparable接口
  35.         private String name;
  36.         private int age;

  37.         
  38.     Mouse(String name,int age){
  39.                 this.name=name; this.age=age;
  40.                 }
  41.         public void getSong(String belongid){
  42.                 System.out.println("被猫咪咬过之后老鼠的声音是"+belongid);
  43.         }
  44.         public void setName(String name){
  45.                 this.name=name;
  46.         }
  47.         public String getName(){
  48.                 return name;
  49.         }
  50.         public void setAge(int age){
  51.                 this.age=age;
  52.         }
  53.         public int getAge(){
  54.                 return age;
  55.         }
  56.         @Override
  57.         public String toString() {
  58.                 // TODO Auto-generated method stub
  59.                 return name+","+age;
  60.         }
  61.         
  62.         public int compareTo(Object obj){                        //实现compareTo方法
  63.                 if(!(obj instanceof Mouse))       
  64.                         throw new RuntimeException("不是老鼠");
  65.                 Mouse m = (Mouse)obj;
  66.                 if(this.age>m.age)
  67.                         return 1;
  68.                 if(this.age==m.age){
  69.                         return this.name.compareTo(m.name);
  70.                 }
  71.                 return -1;
  72.         }
  73.         
  74. }
  75. class Cat {
  76.        String name;
  77.        int age;
  78.         Cat(String name,int age)
  79.            {
  80.                 this.name=name;
  81.                 this.age=age;
  82.                 }
  83. public void Animal(String name,int age){
  84.                 this.name=name;
  85.                 this.age=age;

  86.         }
  87.         public void getSong(String name,int age){
  88.                 System.out.println(name+"的年龄"+age+",他的叫声是这个声音还行吧!");
  89.                
  90.         }
  91.         public void setName(String name){
  92.                 this.name=name;
  93.         }
  94.         public String getName(){
  95.                 return name;
  96.         }
  97.         public void setAge(int age){
  98.                 this.age=age;
  99.         }
  100.         public int getAge(){
  101.                 return age;
  102.         }

  103.         @Override
  104.         public String toString() {
  105.                 // TODO Auto-generated method stub
  106.                 return name+","+age;
  107.         }
  108. }
复制代码
使Mouse类具备比较性继承Comparable接口,也可以自定义比较器
另外红色代码需要改一下
回复 使用道具 举报
public class TreeMapTest  {
/*    我是想把自定义的两个类传给Map,然后将实例化后的四个对象put给map,但是怎么也编译不出来啊,
    我标记的红色部分不知道写的对不对,自己处理不了,求高手。。*/
    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
           Map<Mouse,Cat>  map=new TreeMap<Mouse,Cat>();
            Cat cat1=new Cat("234", 23);
            Cat cat2=new  Cat("322", 12);
           Mouse mou1=new  Mouse("ww", 43);
           Mouse mou2=new Mouse("fw", 23);
           map.put(mou1, cat1);
           map.put(mou2, cat2);
          Set<Entry<Mouse, Cat>> kets=map.entrySet();//改为Set<Map.Entry<Mouse, Cat>> kets=map.entrySet();
           Iterator<Entry<Mouse, Cat>> it=kets.iterator(); //Iterator<Map.Entry<Mouse, Cat>> it=kets.iterator();
           //Entry是Map的内部类,这样写条理性更好!
           while(it.hasNext()){
           Mouse ca=(Mouse) it.next();// Mouse ca=it.next().getKey();这样才能 得到相应的key
                    Cat ss= map.get(ca);
                   System.out.println(ss+"****"+ca);           
                             }
                             
                    }
                        
              
}

class Mouse implements Comparable {
/*TreeMap的自然排序:TreeMap的所有key必须实现Comparable接口,而且所有key应该是同一类的对象,否则抛出ClassCastException异常*/
    private String name;
    private int age;

   
Mouse(String name,int age){
            this.name=name; this.age=age;
            }
    public void getSong(String belongid){
            System.out.println("被猫咪咬过之后老鼠的声音是"+belongid);
    }
    public void setName(String name){
            this.name=name;
    }
    public String getName(){
            return name;
    }
    public void setAge(int age){
            this.age=age;
    }
    public int getAge(){
            return age;
    }
    @Override
    public String toString() {
            // TODO Auto-generated method stub
            return name+","+age;
    }
    @Override
    public int compareTo(Object o) {
        // TODO Auto-generated method stub
        return 0;
    }
}
class Cat {
     String name;
   int age;
    Cat(String name,int age)
       {
            this.name=name;
            this.age=age;
            }
public void Animal(String name,int age){
            this.name=name;
            this.age=age;

    }
    public void getSong(String name,int age){
            System.out.println(name+"的年龄"+age+",他的叫声是这个声音还行吧!");
           
    }
    public void setName(String name){
            this.name=name;
    }
    public String getName(){
            return name;
    }
    public void setAge(int age){
            this.age=age;
    }
    public int getAge(){
            return age;
    }

    @Override
    public String toString() {
            // TODO Auto-generated method stub
            return name+","+age;
    }
}
注:补充  TreeMap的另外一种排序---定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中所有的key进行排序,采用定制排序时不要求map的key实现comparable接口!

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
谢谢大家,可以了。呵呵{:soso_e100:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马