将HashMap存储在另一个HashMap中并提高性能

时间:2012-01-14 17:49:28

标签: java hashmap

我应该在另一个HashMap内创建一个HashMap,如下所示,它可以根据外部HashMap的密钥在内部HashMap内存储值运行时

即。程序所需的输出格式应为

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

其中1,2是外部HashMap的键值。

以下是为其提供的代码是否有更好的方法来提高性能

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 个答案:

答案 0 :(得分:2)

与Vadim的答案类似,但进一步改进了 - 因为它不需要同时调用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]);
}

它对命名约定和使用Collections接口而不是具体类型也有一些小的改进。

我也删除了对clone的通话。这可能会略微节省 - 我认为它不会给你预期的结果。

最后 - 我改变的另一件事可能是稍微改进,就是使用预编译的Pattern将你的String拆分成字段。

答案 1 :(得分:1)

优化几乎总是一个坏主意。特别是在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;}
}

我并没有声称这会提高性能,但它可能是更好的设计。我不太清楚你在做什么,所以也许这不是更好的设计。

答案 2 :(得分:0)

从性能的角度来看,您的代码已经足够好了。 我想到的只有少数事情。如果/ else条件可以简化,你不需要在else部分克隆map(使用指针)

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]);
    }
}