首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

求IdentityHashMap顺序的有关问题,非常急

2013-03-14 
求IdentityHashMap顺序的问题,非常急!我用了IdentityHashMap这个类,把相同的键值放进去,问题就来了,当我读

求IdentityHashMap顺序的问题,非常急!
我用了IdentityHashMap这个类,把相同的键值放进去,问题就来了,当我读取的时候这个map的时候,每次的顺序都不同,有什么办法可以让它来原来放进去的顺序原样输出?


Map map = new java.util.IdentityHashMap();
map.put("a",1);
map.put("b",2);
map.put("c",3);
map.put("a",4);

上面代码是每次读出来的顺序都有可能不一样.
[解决办法]
LinkedHashMap解决你的问题
[解决办法]
public class IdentityHashMapOperate
{
    public static IdentityHashMap addValue(IdentityHashMap map, String key, Object value)
    {
        if(map.get("sort").toString() == null)//没有顺序控制key
        {
            map.put("sort", key);//直接增加顺序控制key
            map.put(key, value);
        }
        else
        {
              String sort = map.get("sort").toString();//取出顺序控制key
              sort+= "^"+key;//需要控制顺序的key
              map.put("sort", sort);//回写到map
              map.put(key, value);
        }

        return map;
    }

    public static ArrayList getValues(IdentityHashMap map)
    {
        String sort = map.get("sort").toString();
        ArrayList values = new ArrayList();

        if(sort != null)
        { 
            String[] sortKeys = sort.split("\\^");

            for(int i = 0; i < sortKeys.length; i++)
            {
                values.add(map.get(sortKeys[i]));
            }
        }
        return values;
    }
}

大概如此了。
[解决办法]
引用:
引用:使用的时候:
Map map = new java.util.IdentityHashMap();
map = IdentityHashMapOperate.addValue(map, "a", 1);//用这个类的方法来维护map
想获得顺序的值:
ArrayList list = IdentityHashMapO……


我看了看,确实有点问题,因为是直接在页面上敲的,但是思路已经很明确了,而且问题不大,你自己应该能调试出来的。
[解决办法]
经过测试的新类:
package cn.com.medicon.test;

import java.util.ArrayList;


import java.util.IdentityHashMap;

public class IdentityHashMapOperate
{
    public static IdentityHashMap addValue(IdentityHashMap map, String key, Object value)
    {
        if(map.get("sort") == null)//没有顺序控制key
        {
            map.put("sort", key);//直接增加顺序控制key
            map.put(key, value);
        }
        else
        {
              String sort = map.get("sort").toString();//取出顺序控制key
              sort+= "^"+key;//需要控制顺序的key
              map.put("sort", sort);//回写到map
              map.put(key, value);
        }

        return map;
    }

    public static ArrayList getValues(IdentityHashMap map)
    {
        String sort = map.get("sort").toString();
        ArrayList values = new ArrayList();

        if(sort != null)
        { 
            String[] sortKeys = sort.split("\\^");

            for(int i = 0; i < sortKeys.length; i++)
            {
                String key = sortKeys[i];
                Object value = map.get(key.intern());
                values.add(value);
            }
        }
        return values;
    }
}

包名别忘了改哈,这是我自己的测试包。

测试类:
public class FilterTest
{
    public static void main(String[] args)
    {
        IdentityHashMap map = new IdentityHashMap();
        map = IdentityHashMapOperate.addValue(map, "a", 1);
        map = IdentityHashMapOperate.addValue(map, "b", 2);
        map = IdentityHashMapOperate.addValue(map, "c", 3);
        map = IdentityHashMapOperate.addValue(map, "d", 4);
        ArrayList list = IdentityHashMapOperate.getValues(map);
        for(int i = 0; i<list.size();i++)


        {
            System.out.println(list.get(i));
        }
    }
}
[解决办法]
首先针对这种问题,你描述的还不够仔细,你还应该说说这个map应用的场景,有什么要求,是否必须透明地使得map.values()或者map.entrySet()维持一个顺序,另外这个顺序是否必须是插入顺序,如果不是插入顺序,但保证每次迭代顺序都相同又是否可行。
1、如果,这个设计的要求,如你所说的需要严格保证:必须插入顺序,map是交给另外程序通过values()来迭代的,那么你只能重写自己的HashMap,参考LinkedHashMap的代码和IdentityHashMap结合一下,很容易就整出一个,另外LinkedHashMap还额外提供了访问顺序,这部分你可以剔除;
2、你是否能够接受一个并非插入顺序的固定顺序迭代,同时使用a==b替代a.equals(b)的哈希表呢?比如按照内存地址的排序顺序,如果可以,那么我可以提供一个比较简洁的实现方案:


public static void main(String...args) throws Exception{
    String a="1";
    String b="2";
    String c="3";
    a+=b+c;
    b="1"+b+c;
    c="1"+"2"+"3";
    System.out.println(a+","+b+","+c+","+(a==b)+","+(b==c));
    Map map=new TreeMap(new Comparator<Object>(){
      @Override
      public int compare(Object a,Object b){
        return System.identityHashCode(a)-System.identityHashCode(b);
      }
    });
    map.put(c,"3");
    map.put(b,"2");
    map.put(a,"1");
    System.out.println(map.get(a));
    System.out.println(map.get(b));
    System.out.println(map.get(c));
    new IdentityHashMap();
  }

觉得这个题目比较有意思,一时兴起随便写的,就算能用你也多测试测试哦!!!

热点排行