Мой текстовый файл содержит такие данные, как... 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 в качестве ключа карты, как мне взять данные из моего списка и сохранить их как значение для ключа? (должны отображаться обе совпадающие строки для ИТ).
Я новичок в работе с коллекциями и заранее благодарю за любую помощь, оказанную для завершения этого.
Текстовый файл обрабатывается с использованием Hashmap, содержащего список (карт) в качестве значений. Как обрабатывать?
Ответы (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() и т.д..
Ваша проблема заключается в том, что данные, отличные от идентификатора студента, хранятся в виде значения, а не ключа.
Это одна из трудностей при поиске по неключевым значениям. Если ваше значение поиска не является ключом, вам нужно перебрать все значения, чтобы найти совпадения.
Сохраните текущее решение, но реализуйте метод 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>
в качестве значения.
studentID -> [departmentId, contact, info field 3, info field 4...]
. Вы сможете вытащить список массивов в итераторе и затем использовать метод contains
.
- person Jason; 21.05.2013