实现两个HashMaps

时间:2011-02-11 11:30:13

标签: java

我正在尝试实现两个HashMaps的组合.Below是我的代码,但我无法生成我真正想要的东西。 我的代码的结果是:

{{userId1=clientID1}=timestamp1}
{{userId1=clientID1, userId2=clientID2}=timestamp2, {userId1=clientID1, userId2=clientID2}=timestamp1}

其实我需要:

{{userId1=clientID1}=timestamp1},{userId2=clientID2}=timestamp2},{userId3=clientID3}=timestamp3}..}

即一对一的映射。我们真的可以实现这个要求吗?如果没有人可以为这种类型的映射提出方法。我将非常感谢......

public static void main (String args[]) 
{
HashMap map = new HashMap<String, String>(); 
HashMap<HashMap,String>  multi = new HashMap();
map.put("userId1", "clientID1");
multi.put(map, "timestamp1");

System.out.println(multi);   //gives me correct requirement

map.put("userId2", "clientID2");
multi.put(map, "timestamp2");

System.out.println(multi);   //since the table is filled again a combination of values results(each time it keeps on increasing) which is not really required as per my requirement .Hope my problem is clear.please do help me ..
}

7 个答案:

答案 0 :(得分:2)

为什么你不能简单地使用两个单独的地图,一个是userId - &gt; clientId和另一个是userId - &gt;时间戳?首先使用Map作为Map键的原因是什么?

请记住,Map在Java中是可变的,并且使用可变对象作为Map的键通常是一种非常糟糕的做法。

答案 1 :(得分:0)

你需要的不是两个HashMap而只有一个。 map的值应该由client_id和timestamp组成。

请参阅此代码:

public class Compose {
  int clientId;
  Date timestamp;
}

地图将是HashMap,其中键为user_id,值为Compose。

答案 2 :(得分:0)

问题在于,随着时间的推移,您将增加第一个HashMap中元素的数量。想想map HashMap在add的第一次和第二次multi操作中包含的内容。

要解决此问题,每次向multi添加内容时都需要创建一个新的HashMap

HashMap<HashMap,String>  multi = new HashMap();
HashMap<String,String> key = new HashMap<String,String>();
key.add("userID","clientID");
multi.add(key,"timestamp");

HashMap<String,String> key = new HashMap<String,String>();
key.add("userID2","clientID2");
multi.add(key,"timestamp");

你可以看到它会变得有点笨拙并且不是最有效的内存。我要做的是创建一个像userID:clientID这样的组合字符串键,并在多个中使用

HashMap<HashMap,String>  multi = new HashMap();
multi.add("userID:clientID","timestamp");

我不知道你的申请是否可行。

答案 3 :(得分:0)

您应该创建一个自定义对象,如下所示:

public class Mapping{

    private final String userId;
    private final String clientId;

    public Mapping(final String userId, final String clientId){
        this.userId = userId;
        this.clientId = clientId;
    }

    public String getUserId(){
        return userId;
    }

    public String getClientId(){
        return clientId;
    }

    // implement hashcode and equals using userId and clientId,
    // or it won't work !!!

}

现在使用此对象作为HashMap中的键(时间戳可能应为long / Long):

Map<Mapping,Long> clientMappings = new HashMap<Mapping,Long>();

// register a client mapping
clientMappings.put(new Mapping(userId, clientId), System.currentTimeMillis());

// get a client mapping timestamp, will be null if no such mapping exists
Long timeStamp = clientMappings.get(new Mapping(userId, clientId));

答案 4 :(得分:0)

我认为错误在行

map.put("userId2", "clientID2");

您正在将值添加到旧的Hashmap中,但您需要创建一个secound HashMap。

以下应该可以解决问题。

public static void main (String args[]) 
{
HashMap map = new HashMap<String, String>(); 
HashMap<HashMap,String>  multi = new HashMap();
map.put("userId1", "clientID1");
multi.put(map, "timestamp1");

System.out.println(multi);   //gives me correct requirement

map = new HashMap();
map.put("userId2", "clientID2");
multi.put(map, "timestamp2");

System.out.println(multi);   //since the table is filled again a combination of values results(each time it keeps on increasing) which is not really required as per my requirement .Hope my problem is clear.please do help me ..
}

答案 5 :(得分:0)

我不确定你为什么要做你所描述的,但如果你详细说明,我很确定有一个比你现在想要使用的设计更好的设计。

但是,如果你想继续沿着相同的路径行进,那么你的问题似乎就是你一遍又一遍地更新“地图”而且这个引用并没有改变。当您更改地图上的元素时,您需要为每次键创建一个新的HashMap对象,此更改将过滤为多个。

你有没有试过这样的事情:

Map<Map, String> multi = new HashMap<Map, String>();
Map<String, String> map = new HashMap<String, String>();

map.put("userId1", "clientID1");
multi.put(map, "timestamp1");

map = new HashMap<String, String>();

map.put("userId2", "clientID2");
multi.put(map, "timestamp2");

注意上面地图的第二次实例化。

答案 6 :(得分:0)

一种解决方案是创建一个包含clientId,userId和timestamp字段的类:


class ClientDetails {
   String clientId;
   String userId;
   Date timestamp;
}

然后使用clientId作为键创建一个映射,将ClientDetails作为值创建。

但是,如果需要将此类用作键 - 则必须至少覆盖equals(Object obj)方法。以下是一个示例:


public class Main {

    public class Client {

        public String clientId;
        public String userId;

        public Client(String p_clientId, String p_userID) {

            this.clientId = p_clientId;
            this.userId = p_userID;
        }

        @Override
        public boolean equals(Object obj) {

            boolean result = false;
            if (obj != null && obj instanceof Client) {
                Client client = (Client) obj;
                if (client.clientId.equals(clientId)
                        && client.userId.equals(userId)) {

                    result = true;
                } else {
                    result = false;
                }
            } else {
                result = super.equals(obj);
            }
            return result;
        }
    }

    public static void main(String[] args) {

        Main main = new Main();
        Map<Client, Date> hashMap = new HashMap<Client, Date>();
        hashMap.put(main.new Client("clientId1", "userId1"), new Date());
    }

}

为了清楚起见,我省略了一些空检查。