小弟近来学习java中的集合,写了个map系列(所有继承mpa接口的集合类)集合的通过值来查找键(key)的方法,但是有错误,先看看代码吧
public class Select 
{
   public static Object[] mapValue(Map m,Object value)//通过值来查找键,可能返回多个值,
     //因为,map中键不可以一样,但是值可以重复
    /**
     * 原理:由于map是一个键对应一个值,所以一个map中有多少个键,就有多少个值,用2个容器分别保存键和值,
     * 然后遍历保存值的容器,如果传进来的参数和值相等,就取出当前容器的下标,
     * 按照这个下标,从保存键的容器中取出相应的键
     */
    {
        if(m.containsValue(value))
        {
            Collection sKey=m.keySet();//用来保存键的集合
            Collection sValue=m.values();//用来保存值的集合
            Object o[]=null;//保存键的集合
            Object o1[]=null;//保存值的集合
            Object o2[]=null;//保存结果的集合
            int q=0;
            o=sKey.toArray();
            o1=sValue.toArray();
            System.out.println(o.length+"<---------->"+o1.length);
            for(int i=0;i<o.length;i++)
            {
                System.out.println(o[i]+"----"+o1[i]);
            }
            for(int k=0;k<o.length;k++)
            {
                if(value.equals(o1[k]))//这个地方没写好
                {
                    o2[q]=o[k];//结果显示这里有空引用
                    q=q+1;
                }
            }
            return o2;
        }
        else
        {
            return null;
        }
}下面是一个测试的代码
public class MyHashMap 
{    public static void main(String[] args) throws Exception
    {
        HashMap hm=new HashMap();
        Stu s1=new Stu(1,"张三");
        Stu s2=new Stu(3,"李四");
        Stu s3=new Stu(2,"王五");
        Grade g1=new Grade(70,80);
        Grade g2=new Grade(80,90);
        Grade g3=new Grade(70,90);
        hm.put(s1,g1);
        hm.put(s2,g2);
        hm.put(s3,g3);
        System.out.println("--------------------");
        System.out.println(Select.mapValue(hm,g1));
        System.out.println("--------------------");
    }
}
这个最后显示出来的结果应该是s1的对象
但是实际的结果是有空引用
请大家帮我看看呀
或者还有更好的办法通过值来查找键的也说说思路,我现在觉得我的这个思路有点错!

解决方案 »

  1.   

    忘了把stu和Grade类的代码帖上来了
    public class Grade 
    {    int chinese;
        int math;
        public Grade(int c,int m) 
        {
            chinese=c;
            math=m;
        }     public String toString() {
             return "语文>>>:"+chinese+"   数学>>>"+math;
        }
    }
    public class Stu 
    {    int id;
        String name;
        public Stu(int id,String name) 
        {
            this.id=id;
            this.name=name;
        }     public String toString() {
             return "编号>>>:"+id+"   姓名>>>"+name;
        }
    }
      

  2.   

    Object o2[]=null;//保存结果的集合
                        o2[q]=o[k];//结果显示这里有空引用
    o2是空的数祖对象,对于数组对象必须要先NEW一个对象值才可以对其进行操作。
      

  3.   

    同意楼上
     Object o2[] = null; //需要new 
      

  4.   

    o = sKey.toArray();
          o1 = sValue.toArray();
          o2 = new Object[m.size()];//加上这句
      

  5.   

    import java.util.*;public class Select {
        // 因为,map中键不可以一样,但是值可以重复
        /**
         * 原理:由于map是一个键对应一个值,所以一个map中有多少个键,就有多少个值,用2个容器分别保存键和值,
         * 然后遍历保存值的容器,如果传进来的参数和值相等,就取出当前容器的下标, 按照这个下标,从保存键的容器中取出相应的键
         */
        public static Object[] mapValue(Map m, Object value) {
            if (m.containsValue(value)) {
                Collection sKey = m.keySet();// 用来保存键的集合
                Collection sValue = m.values();// 用来保存值的集合
                Object o[] = null;// 保存键的集合
                Object o1[] = null;// 保存值的集合
                Object o2[] = null;// 保存结果的集合
                ArrayList list = new ArrayList();
                //int q = 0;
                o = sKey.toArray();
                o1 = sValue.toArray();
                System.out.println(o.length + "<---------->" + o1.length);
                for (int i = 0; i < o.length; i++) {
                    System.out.println(o[i] + "----" + o1[i]);
                }
                for (int k = 0; k < o.length; k++) {
                    if (value.equals(o1[k]))// 这个地方没写好
                    {
                        list.add(o[k]);
                        //o2[q] = o1[k];// 结果显示这里有空引用
                        //q = q + 1;
                    }
                }
                o2 = list.toArray();
                return o2;
            } else {
                return null;
            }
        }
    }
      

  6.   

    to: mofeir(损人专家) ( ) 信誉:99 
    看了你的代码,你是增加了一个ArrayList集合,然后调用ArrayList的toArray方法把返回的数组赋给o2
    我觉得这样对程序的占用资源很大,本来我就用了3个数组了,想想,如果map集合里面的记录有100万条,我的这种思路我觉得根本就行不通了
      

  7.   

    public static Object[] mapValue(Map m, Object value) {
            Object[] keys = new Object[]{};
            Set entryset = m.entrySet();
            int i = 0;
            for(Iterator iter = entryset.iterator();iter.hasNext();){
                Entry entry = (Entry)iter.next();
                if(entry.getValue() == value){
                    keys[i] = entry.getKey();
                    i++;
                }
            }
            return keys;
    }
      

  8.   

    上面的有点错误,最好改为动态数组
        public static Object[] mapValue(Map m, Object value) {
            Vector keys = new Vector();
            Set entryset = m.entrySet();
            int i = 0;
            for (Iterator iter = entryset.iterator(); iter.hasNext();) {
                Entry entry = (Entry) iter.next();
                if (entry.getValue() == value) {
                    System.out.println(entry.getKey());
                    keys.add(entry.getKey());
                    i++;
                }
            }
            return keys.toArray();
        }