Лучшая структура данных для более быстрого чтения в Map of Map of Lists - PullRequest
0 голосов
/ 27 ноября 2011

У меня есть сценарий, в котором мне нужно хранить карту карты карты списка иерархии данных для обработки в памяти. И, в настоящее время я думаю реализовать структуру данных как

Map<Integer, Map<String, Map<Integer, List<String> > > >

и типы бетонов:

HashMap<stdIdInt, HashMap<libraryNameStr, HashMap<topicIdInt, ArrayList<bookNameStr> > > >

Поскольку мне не нужно поддерживать какой-либо конкретный порядок, я также думаю заменить List на Set (HashSet), что потенциально может повысить производительность.

Хотя я пытался до сих пор, я также думаю, что использование Google 'Guava Multimap является жизнеспособной альтернативой, но я не уверен.

Справочная информация: Мне нужно хранить сведения о каждого студента id и их интересующие названия книг информация, классифицированная по их типу темы , которая будет в дальнейшем организована по именам библиотек . Мне нужно обрабатывать данные и отображать названия книг в основном по идентификатору студента, а в другое время - по имени библиотеки и типу темы. И как только имя книги показано пользователю, мне нужно удалить эту запись из списка Имена книг .

Структура данных должна хранить и обрабатывать тысячи записей с высокой скоростью и будет хранить данные в течение более длительного времени.

Пожалуйста, предложите подход или другую структуру данных для более быстрой обработки, а о типе структуры данных / класса сбора и их комбинации использования.

(обратите внимание, что сценарий, который я описал выше, не является точным случаем, но я изо всех сил пытался абстрагироваться от сложности иерархии данных)

1 Ответ

3 голосов
/ 27 ноября 2011

Я думаю, вам здесь не хватает абстракций. Практическое правило: каждый раз, когда в коллекции хранится другая коллекция, следует вводить промежуточный объект .

В вашем случае это мой предложенный ОО дизайн:

class Student {
    private int id;
    private Map<Integer, Library> libraries;
    private getLibrary(int id) {return libraries.get(id);}
}

class Library {
    private int id;
    private Map<Integer, Topic> topics;
    private getTopic(int id) {return topics.get(id);}
}

class Topic {
    private int id;
    private Map<Integer, Book> books;
    private getBook(int id) {return books.get(id);}
}

class Book {
    private int id;
    private String name;
}

И использование:

Map<Integer, Student> students = //...
students.get(6).getLibrary(5).getTopic(4).getBook(3)

Конечно, этот код требует много дальнейших улучшений. Например. вам не нужно больше, чем один . в строке. Но это уже намного более читабельно, чем:

students.get(6).get(5).get(4).get(3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...