Общее слияние двух хэш-карт - PullRequest
1 голос
/ 26 ноября 2011

В Java, если у меня есть два объекта A и B, и оба содержат переменные класса для ссылочного идентификатора, а A также имеет тип переменной класса, B имеет местоположение переменной класса. Я пытаюсь построить карту с ключом в качестве типа и значение в качестве местоположения. В настоящее время я делаю это путем создания двух отдельных карт, одна карта (Map1) связывает ссылочный идентификатор с типом и создается путем итерации по списку объектов типа A, а другая карта (Map2) связывает ссылочный идентификатор с местоположением и создается перебирая список объектов типа B. Затем карты объединяются путем перебора набора ключей Map1 и поиска значения для ссылочного идентификатора, помещения его в качестве ключа в новую карту и получения значения местоположения. из 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));
}

Ответы [ 3 ]

1 голос
/ 26 ноября 2011

Вы можете оптимизировать его, удалив один из 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()));
}
0 голосов
/ 26 ноября 2011

Почему бы просто не поискать объекты Location и Info по referenceId, а затем поместить их в 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());
}

Я знаю, что это не совсем то, что вы искали, но я надеюсь, что это поможет.

0 голосов
/ 26 ноября 2011

Мой вопрос: есть ли более эффективный способ сделать этот алгоритм?

Я не думаю, что есть более эффективный способ выполнить эту операцию. Я даже не могу придумать лучшего представления / реализации для окончательного отображения typeToLocation, если только в ключах / значениях нет чего-то особенного, что позволяет вам использовать ярлыки.

(Кстати, я бы не назвал операцию, которую вы выполняете, «слиянием». С математической точки зрения это больше похоже на «композицию» отображений, хотя это не совсем так. Для меня » объединение карт просто создает объединение их записей, и я думал, что вы изначально имели в виду ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...