我正在尝试实现两个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 ..
}
答案 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());
}
}
为了清楚起见,我省略了一些空检查。