LinkedHashMap - получить индекс вставленного элемента - PullRequest
0 голосов
/ 14 января 2019

Мне нужно реализовать в 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 голосов
/ 14 января 2019

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

Из того, что я могу найти о TStringList, его способности, связанные с объектами, основаны только на поиске. Таким образом, Java-эквивалент будет просто List<String> для строк, а затем предположительно другой List<T> равного размера со связанными объектами. Поиски O (n) (перебирайте список, пока не найдете свою запись).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...