我应该在另一个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);
}
}
答案 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]);
}
}