在java中,如果我有两个对象A和B,并且两者都包含引用id的类变量,而A也有类变量类型,则B具有类变量位置。我正在尝试构建一个地图,其中键作为类型,值作为位置。目前我通过构建两个单独的映射来实现这一点,一个映射(Map1)将引用id链接到类型,并通过迭代类型A的对象列表构建,另一个映射(Map2)将引用id链接到位置和通过迭代类型B的对象列表来构造。然后通过迭代Map1的keySet并找到引用id的值,将其作为新映射中的键,然后获取值来合并映射。 Map2的位置,并将其用作类型的值。实施如下所示。我的问题是:有没有更有效的方法来做这个算法?这似乎不是最好的实现。对于歧义感到抱歉 - 希望代码能让问题更清晰。
Map<String, String> referenceIdToType = new HashMap<String, String>();
Map<String, String> referenceIdToLocation = new HashMap<String, String>();
for(Info info : infoList) {
referenceIdToType.put(info.getReferenceId(), info.getType());
}
for(Location loc : locationList) {
referenceIdToLocation.put(loc.getReferenceId(), loc.getLocation());
}
Map<String, String> typeToLocation = new HashMap<String, String>();
for(String referenceId : referenceIdToType.keySet()) {
typeToLocation.put(referenceIdToType.get(referenceId), referenceIdToLocation.get(referenceId));
}
答案 0 :(得分:1)
您可以通过删除其中一个HashMaps来优化它。您只需要为其中一个列表创建一个HashMap。然后通过循环遍历第二个列表来构建最终的HashMap,使用另一个列表的HasMap来获取匹配值。
Map<String, String> referenceIdToLocation = new HashMap<String, String>();
for(Location loc : locationList) {
referenceIdToLocation.put(loc.getReferenceId(), loc.getLocation());
}
Map<String, String> typeToLocation = new HashMap<String, String>();
for(Info info : infoList) {
typeToLocation.put(info.getType(), referenceIdToLocation.get(info.getReferenceId()));
}
答案 1 :(得分:0)
我的问题是:有更有效的方法来执行此算法吗?
我认为没有更有效的方法来执行该操作。我甚至无法想到最终typeToLocation
映射的更好的表示/实现,除非有关键/值的特殊内容允许您使用快捷方式。
(顺便说一句,我不会把你正在进行的操作称为“合并”。从数学的角度来看,它更像是映射的“组合”,尽管它并不严格。对我来说,“合并“地图只是创建他们的条目的联合,这就是我认为你最初的意思......”
答案 2 :(得分:0)
为什么不通过referenceId查找Location
和Info
个对象,然后将它们放入HashMap
?
ArrayList<String> referenceIds = //all reference ids;
public Location getLocationByReferenceId(String referenceId)
{
for(Location loc : locationList)
{
if(loc.getReferenceId().equals(referenceId))
return loc;
}
}
public Info getInfoByReferenceId(String referenceId)
{
for(Info info : infoList)
{
if(info.getReferenceId().equals(referenceId))
return info;
}
}
然后,您只需创建一个地图并调用getType()
和getLocation()
Map<String, String> typeToLocation = new HashMap<String, String>();
for(String refID : referenceIds)
{
Location loc = getLocationByReferenceId(refID);
Info info = getInfoByReferenceId(refID);
typeToLocation.put(info.getType(), loc.getLocation());
}
我知道这不是你想要的,但我希望它有所帮助。