LinkedHashMap-获取插入项的索引

时间:2019-01-14 18:19:33

标签: java delphi

我需要用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的最佳方法吗?

1 个答案:

答案 0 :(得分:1)

LinkedHashMap类可确保在您对其进行迭代时,将以与您放入它们相同的顺序返回元素,但是说它已被索引是错误的。没有'indexOf'方法,找出索引的唯一方法是遍历整个地图,这很慢,而且不是预期的。

根据我对TStringList的发现,其与对象相关的功能只是基于查找的。因此,java等效项将只是字符串的List<String>,然后是与关联对象大小相等的另一个List<T>。查找为O(n)(遍历列表直到找到记录)。