Хранение HashMap внутри другого HashMap и повышение производительности - PullRequest
7 голосов
/ 14 января 2012

Я должен создать HashMap внутри другого HashMap, как показано ниже, который может хранить значение внутри внутреннего HashMap на основе ключа внешнего HashMap во время выполнения

т.е. требуемый вывод для программы должен иметь формат

   { 1 = {11 = "aaa",15 = "bbb"}, 2 = {13 = "ccc", 14 = "ddd"} }

где 1,2 - ключевые значения для внешнего хэш-карты.

Ниже приведен код для него. Есть ли лучший подход для повышения производительности

HashMap<Integer, HashMap<Integer, String>>Outer 
                   = new HashMap<Integer, HashMap<Integer,String>>();

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int count = Integer.parseInt(br.readLine());
    for(int i =0;i<count;i++)
    {
        String input[] = br.readLine().split("\\s");

        //HashMap<Integer,String>inner = new HashMap<Integer, String>();
        int key = Integer.parseInt(input[0]);
        if(Outer.isEmpty() || !Outer.containsKey(key))
        {
            HashMap<Integer, String> inner = new HashMap<Integer, String>();
            inner.put(Integer.parseInt(input[1]),input[2]);
            Outer.put(key, inner);
        }
        else if(Outer.containsKey(key))
            {
                HashMap<Integer, String> inner = (HashMap<Integer, String>) Outer.get(key).clone();
                inner.put(Integer.parseInt(input[1]), input[2]);
                Outer.put(key, inner);
            }
    }

Ответы [ 3 ]

3 голосов
/ 14 января 2012

Аналогичен ответу Вадима, но еще более улучшен, поскольку не требует вызова как containsKey, так и get:

Map<Integer, Map<Integer, String>> outer = new HashMap<Integer, Map<Integer, String>>();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int count = Integer.parseInt(br.readLine());

Pattern splitter = Pattern.compile("\\s");

for(int i = 0; i < count; i++){
    String input[] = splitter.split(br.readLine());

    int key = Integer.parseInt(input[0]);

    Map<Integer, String> inner = outer.get(key);
    if(inner == null){
        inner = new HashMap<Integer, String>();
        outer.put(key, inner);
    }
    inner.put(Integer.parseInt(input[1]), input[2]);
}

В нем также есть некоторые незначительные улучшения для соглашений об именах и использования интерфейсов Коллекций вместо конкретных типов.

Я также удалил вызов на clone. Это может быть небольшая экономия - и я не думаю, что это дало бы вам ожидаемые результаты.

Наконец, еще одна вещь, которую я изменил и которая может быть небольшим улучшением, - это использование предварительно скомпилированного Pattern для разбиения вашей String на поля.

1 голос
/ 14 января 2012

Оптимизация почти всегда плохая идея.Особенно в Java, где JVM достаточно хорошо справляется с этим самостоятельно.

Вам действительно нужен Map<Integer, Map<Integer, String>>, мне кажется, вам действительно нужен Map<Pair, String>, где

public final class Pair {
  private final int x;
  private final int y;
  public Pair(int x, int y) { this.x = x; this.y = y;}
}

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

0 голосов
/ 14 января 2012

Ваш код достаточно хорош с точки зрения производительности.Только несколько вещей пришло мне в голову.Если условие / else можно упростить и вам не нужно клонировать карту в другой части (работа с указателем)

HashMap<Integer, HashMap<Integer, String>>Outer = new HashMap<Integer,   HashMap<Integer,String>>();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int count = Integer.parseInt(br.readLine());
for(int i =0;i<count;i++)
{
    String input[] = br.readLine().split("\\s");

    //HashMap<Integer,String>inner = new HashMap<Integer, String>();
    int key = Integer.parseInt(input[0]);
    if(!Outer.containsKey(key))
    {
        HashMap<Integer, String> inner = new HashMap<Integer, String>();
        inner.put(Integer.parseInt(input[1]),input[2]);
        Outer.put(key, inner);
    }
    else
    {
        HashMap<Integer, String> inner = Outer.get(key);
        inner.put(Integer.parseInt(input[1]), input[2]);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...