Как закодировать заданный метод карты с другой картой в качестве значения? - PullRequest
0 голосов
/ 28 мая 2010

Обычно я делаю это, чтобы установить новую Карту в частную переменную:

public static void setListaClausulas(Map<String, Clausula> nvLista) {
    listaClausulas = new TreeMap<String, Clausula>(nvLista);
}

Полагаю, это нормально - установить новую копию nvLista и всех ее членов, а не ссылки, не так ли?

Но теперь у меня есть Карта внутри другой Карты, и я делаю это:

public static void setListaClausulas(Map<String, Map<String, Clausula>> nvLista) {
    listaClausulas = new TreeMap<String, Map<String, Clausula>>(nvLista);
}

Это правильный способ сделать это или вы рекомендуете что-то еще? Я хочу установить новую копию nvLista (и все ее элементы), а не копировать только ссылку.

Ответы [ 2 ]

1 голос
/ 28 мая 2010

Я полагаю, вы беспокоитесь о том, что карты, передаваемые в вашем методе, будут видоизменены?

Вам необходимо создать глубокую копию параметра. В этом вопросе SO обсуждаются различные подходы: deep-clone-utility-рекомендация

РЕДАКТИРОВАТЬ: В ответ на комментарий вот кодированная версия. Это не копирует глубоко Clausula экземпляры, так как они не были скопированы ранее - я предполагаю, что они неизменны.

public Map<String, Map<String, Clausula>> deepCopy(Map<String, Map<String, Clausula>> nvLista)
{
   Map<String, Map<String, Clausula>> target = new TreeMap<String, Map<String, Clausula>>();
   for (String key: nvLista.keySet()) {
       Map<String, Clausula> value = nvLista.get(key);
       target.put(key, new TreeMap<String,Clausula>(value));
   }
   return target;
}

Однако вложенные типы коллекций быстро становятся нечитаемыми. Если вы можете изменить код, это может помочь читаемости создать объект-оболочку для самой внутренней карты.

0 голосов
/ 28 мая 2010

Глубокое копирование трудно для общего случая, но вы можете сделать это, чтобы решить вашу конкретную проблему:

static Map< String, Map< String, Clausula > > deepCopy (
        final Map< String, Map< String, Clausula > > source
    )
{
    final TreeMap< String, Map< String, Clausula> > result  =
        new TreeMap< String, Map<String,Clausula> >( );

    for (
        final Map.Entry< String, Map< String, Clausula> > cur :
            source.entrySet( )
    )
    {
        result.put(
            cur.getKey( ),
            new TreeMap< String, Clausula >( cur.getValue( ) )
        );
    }

    return result;
}
...