Текстовый файл обрабатывается с использованием Hashmap, содержащего список (карт) в качестве значений. Как обрабатывать?

Мой текстовый файл содержит такие данные, как... dept->studentId-StudentData(имя и адрес электронной почты)..
IT-> 1->john->[email protected]
CSE->2-> Santosh->[email protected]
IT->3->Mike->[email protected]
Во-первых, я сохранил studentId как ключ, а studentData и dept как значения в хэш-карте и добавил в arraylist (список нескольких объектов-каждый объект списка для каждой строки). Теперь, с отделом в качестве ключа, как мне получить StudentId и studentData из моего списка? Скажем, с IT в качестве ключа карты, как мне взять данные из моего списка и сохранить их как значение для ключа? (должны отображаться обе совпадающие строки для ИТ).

Я новичок в работе с коллекциями и заранее благодарю за любую помощь, оказанную для завершения этого.


person user2376600    schedule 21.05.2013    source источник


Ответы (2)


Почему бы не использовать Student Object вместо ArrayList. Это также сделает ваш код более организованным.

Создайте HashMap ‹ String, Student ›, где string — это идентификатор студента, а Student — это класс со всеми атрибутами студента.

class Student{
     String name;
     String dept;
     String email;

     /** Getters & Setters **/

}

Поэтому в следующий раз вы просто запустите map.get("STUDENT_ID_HERE").getName() или getDept() и т.д..

person Yash Sharma    schedule 21.05.2013
comment
Спасибо. Уже пробовали это делать. Но я должен использовать здесь только arraylist. - person user2376600; 21.05.2013

Ваша проблема заключается в том, что данные, отличные от идентификатора студента, хранятся в виде значения, а не ключа.
Это одна из трудностей при поиске по неключевым значениям. Если ваше значение поиска не является ключом, вам нужно перебрать все значения, чтобы найти совпадения.

Сохраните текущее решение, но реализуйте метод getDeptMapping(String deptID), который перебирает все значения и извлекает списки совпадающих идентификаторов отделов. Это можно сделать с помощью карты. ВходНабор().

Какой-то псевдокод:

public ArrayList<Entry<Key, Value> getDeptMappings(String deptID) {

  //get entry mappings
  Set<Entry<Key, Value>> entrySet = dataMap.entrySet()

  //Create a Entry ArrayList to hold the results
  ArrayList<Entry<Key, Value>> resultList = new ArrayList<Entry<Key. Value>>();

  //Instanciate Set Iterator and retrieve first entry value
  Iterator<Entry<Key, Value>> iter = entrySet.iterator();
  Entry<Key, Value> currentEntry = iter.next();      

  while (iter.hasNext()) {
     //Use currentEntry.getValue() to get the value list from currentEntry
     //Compare list index points values where you stored the department ID during 
     //creation with the method parameter
     //If comparison is true, add this entry to the resultList you 
     //created above.
  }

  //When iteration is complete, return the result list

}

В отличие от обычного извлечения карты по ключу, который равен O(1) или O(log n) в зависимости от реализации, это решение выполняется за линейное время и, следовательно, является O(n).. Обратите внимание, что вам придется вставить свой собственный тип как Key и Value для объекта Entry. Я предполагаю, что вы использовали String в качестве ключа и ArrayList<String> в качестве значения.

person Jason    schedule 21.05.2013
comment
Привет, Джейсон. Спасибо. Не могли бы вы помочь мне с примером кода для цикла итераций? - person user2376600; 21.05.2013
comment
Я не дам вам точного ответа, но вот несколько подсказок. Во-первых, как извлечь определенное значение точки индекса из списка ArrayList? Во-вторых, как сравнить два значения String? Используйте результаты сравнения, чтобы решить, нужно ли его добавить в список результатов. - person Jason; 21.05.2013
comment
Кроме того, моя проблема заключается в следующем. Когда я попытался проверить значение из своего списка с помощью метода .contains, он вернул ложь. Поскольку каждый мой объект списка содержит пару ключ-значение каждой карты в качестве своих значений, он не идентифицирует значения однозначно. - person user2376600; 21.05.2013
comment
Похоже, вам предстоит переделка. Я предлагаю вам реорганизовать функциональность инициализации вашей карты, чтобы вставить отдельные строки в их определенные местоположения индекса. Забудьте о необходимости использования пар ключ-значение в списке. Попробуйте что-то вроде studentID -> [departmentId, contact, info field 3, info field 4...]. Вы сможете вытащить список массивов в итераторе и затем использовать метод contains. - person Jason; 21.05.2013