我需要用Java实现一个早已在Delphi中实现的代码,我试图使用LinkedHashMap(在Delphi中使用了TStringlist),因为我需要在插入元素时获取元素的索引,这是问题所在是它不起作用...
Delphi
sIni:string;
sl, slProfs, slHoras, slDias, slAula: TStringlist;
slHoras := TStringlist(slProfs.Objects[p]);
h := slHoras.indexOf(sIni);
if h < 0 then
begin
sl := TStringlist.Create;
sl.sorted := true;
for i := 1 to 7 do
sl.AddObject(IntToStr(i), TStringlist.Create);
h := slHoras.AddObject(sIni, sl);
end;
slDias := TStringlist(slHoras.Objects[h]);
slAula := TStringlist(slDias.Objects[iDia - 1]);
我正在尝试用Java实现的实现
HashMap<Integer, HashMap<Integer, List<String>>> slProfs = new LinkedHashMap<>();
HashMap<Integer, List<String>> sl = new LinkedHashMap<>();
HashMap<String, HashMap<Integer, List<String>>> slHoras = new LinkedHashMap<>();
HashMap<String,String> slAula = new LinkedHashMap<>();
List <String> slDias = new ArrayList<>();
if (h < 0) {
for (i = 1; i <= 7; i++) {
sl.put(i, new ArrayList<String>());
}
slHoras.put(sIni, sl);
indicesslHoras = new ArrayList<String>(slHoras.keySet()); // <== Set to List
h = indicesslHoras.indexOf(sIni);
}
我无法从位置h获得对象 使用LinkedHashMap,就像在这里完成的一样:
slDias := TStringlist(slHoras.Objects[h]);
slAula := TStringlist(slDias.Objects[iDia - 1]);
Delphi中的代码是使用另一个带有索引的StringList内的StringList实现的。 使用LinkedHashMap的这种方法是将这段代码转录为Java的最佳方法吗?
答案 0 :(得分:1)
LinkedHashMap
类可确保在您对其进行迭代时,将以与您放入它们相同的顺序返回元素,但是说它已被索引是错误的。没有'indexOf'方法,找出索引的唯一方法是遍历整个地图,这很慢,而且不是预期的。
根据我对TStringList的发现,其与对象相关的功能只是基于查找的。因此,java等效项将只是字符串的List<String>
,然后是与关联对象大小相等的另一个List<T>
。查找为O(n)(遍历列表直到找到记录)。