您的位置:首页 > 移动开发 > Objective-C

map用法的一点小小总结

2009-09-24 14:17 399 查看
map的用法,发现这种东西还是要研究套路,套路熟了再去研究它的所以然,硬生生的对着书看,确实有点浪费时间,
一,首先是导入各种包,
import java.util.Map;
import java.util.HashMap;
import java.util.Set;
二,接着构建一个属于map类hashmap的对象,括号内为对应的key和value类型,
Map<String,Integer> map=new HashMap<String,Integer>();
三,接着是放入对象,
map.put(“age”,10); map.put(“age2”,13);
检验结果可以直接打印,System.out.println(map);
逐个打印的話,先构建一个集合为key的set,然后遍历即可,其中map.get(key)=value
Set<String> set = map.keySet();
      for(String key : set)
         System.out.println(key+"="+map.get(key));
import java.util.Map;
import java.util.HashMap;
import java.util.Set;
 
public class TestMap {
         public static void main(String[] args) throws Exception {
            Map<String,Object> map=new HashMap<String,Object>();
            map.put("age", 18);map.put("name", "Robin");
            map.put("id", "008");map.put("height", "1.70");
            map.put("scores", "87");map.put("grade", "normal");
            map.put("gender", "male");
                System.out.println(map);
            Set<String> set=map.keySet();
            for(String key:set)
                System.out.println(key+"="+map.get(key));
           
         }
}
奇怪,刚才我打学生类的就不行,改成object就ok了,好像是我构建的object对象具有如下属性,
有了这些准备知识,现在再来研究反射,昨天那个一点都不懂的题目,
看了不少代码,反射给我的感觉就是完全copy一个class文件,然后调用它的构造,方法,属性等,因为是完全copy的一个副本,所以可以进行操作,设定值什么的,感觉很麻烦,费劲周折一堆公式话的java语句,首先构造出一个目标模板,然后在main方法里导入目标class文件名字之类的,这样复制完成,输入数据就可以得到结果,完全副本一样的效果,但是我不明白这样做的好处,为什么不直接调用目标类的方法,构造,属性呢?因为在某些条件下这些东西不能很容易获得,好吧,这不是我现在要研究的问题,研究反射的套路是首要,
Class c=Class.forName(name); //packagename+classname,it’s the 1st step to get the target’s object.
Object obj=c.newInstance();   //create the object which is the copy of the target
然后所有操作就是在新建副本obj上进行;
不大明白为什么map中的key指代具体对象中的field,因果倒置?因为后面map中首先键入的是field值,所以?这是个问题,先skip[Jes1] 
String mName="set"+key.substring(0, 1).toUpperCase()+key.substring(1);
方法名的取得,其实沒什么好说的,主要是String方法的应用;
Field f=c.getDeclaredField(key);
Method m=c.getMethod(mName,f.getType());
m.invoke(obj, map.get(key));
Method m=c.getMethod("setName", String.class);
m.invoke(obj, "zhang");
System.out.println(obj);
加一条对比下,getMethod
      public static Object getInstance (String name,Map<String,Object> map) throws Exception {
套路记住,
Object obj=getInstance("date0923.Student", map);
System.out.println(obj);
因为前面其实有static那个testfill大可不要,调用本类建立的副本框架,输入具体值,就生成具体类的副本,模板就出来了,
打印,沒什么好说的,
下面是3个重写的介绍,
@Override
      public boolean equals(Object obj) {
         if(obj==null) return false;
         else if(obj.getClass()==this.getClass()) {
            Student s=(Student)obj;
            return s.id==this.id;
         }
         return false;
      }
@Override
      public int hashCode() {
         int type=this.getClass().hashCode();
         return type*41+id;
      }
@Override
      public String toString() {
         return name+","+id+","+age;
      }
自己做的练习,有点累,嘿嘿
package ComprehensiveExercises;
public class Rectangle {
         private int a;
         private int b;
        
         public Rectangle() {
            super();
            System.out.println("Rectangle one");
         }
         public Rectangle(int a,int b) {
            super();
            this.setA(a);
            this.setB(b);
            System.out.println("Rectangle two");
         }
                  
         public int getA() {
            return a;
         }
         public void setA(int a) {
            if(a>0)this.a = a;
            else
                System.err.println("invalid A's length");
         }
         public int getB() {
            return b;
         }
         public void setB(int b) {
            if(b>0)this.b = b;
            else
                System.err.println("invalid B's length");
         }
         @Override
         public boolean equals(Object obj) {
            if(obj==null) return false;
            else if (obj.getClass()==this.getClass()) {
                   Rectangle r=(Rectangle)obj;
                   return r.a==this.a;
            }
            return false;
         }
         @Override
         public int hashCode() {
            int type=this.getClass().hashCode();
            return type*41+a;
         }
         @Override
         public String toString() {
            return "A's length="+a+"; B's length="+b+" ;and the area is="+getArea(a,b);
         }
         public static int getArea(int a,int b) {
            int area=a*b;
            return area;
         }
  
}
package ComprehensiveExercises;
import java.lang.reflect.*;
import java.util.Map;
import java.util.HashMap;
import java.util.Set;
public class TestR {
         public static Object getInstance(String name,Map<String,Object> map) throws Exception{
            Class c=Class.forName(name);
            Object obj=c.newInstance();
            Set<String> set=map.keySet();
            for(String key:set) {
                String mName="set"+key.substring(0,1).toUpperCase()+key.substring(1);
                Field f=c.getDeclaredField(key);
                Method m=c.getMethod(mName, f.getType());
                m.invoke(obj, map.get(key));
            }
         return obj;
         }
         public static void main(String[] args) throws Exception {
            Map<String,Object> map=new HashMap<String,Object>();
            map.put("a",6);map.put("b", 15);
            Object obj=getInstance("ComprehensiveExercises.Rectangle",map);
            System.out.println(obj);
   }
 
}
 
 
 

 [Jes1]暂时還不明白为什么。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息