Инициализировать данные в TreeMap - PullRequest
1 голос
/ 24 января 2012

Имеются такие данные, как: пользователь, идентификатор библиотеки, идентификатор книги, год

1,10, 100,2000
2,10, 100,2000
3,10, 100,2000

2,10, 200,2000
3,10, 200,2000
1,10, 200,2000

Я пытался сохранить их с помощью TreeMap, но вторая группа перезаписала первое, какие-либо предложения?

    TreeMap<Integer, Integer> bookMap = new TreeMap<Integer, Integer>();
    TreeMap<Integer, TreeMap<Integer, Integer>> libraryMap = new TreeMap<Integer, TreeMap<Integer, Integer>>();
    TreeMap<Integer, TreeMap<Integer, TreeMap<Integer, Integer>>> UserMap = new TreeMap<Integer, TreeMap<Integer, TreeMap<Integer, Integer>>>();

    bookMap.put(100, 2000);
    libraryMap.put(10,bookMap);     
    UserMap.put(1,libraryMap);
    UserMap.put(2,libraryMap);
    UserMap.put(3,libraryMap);

    bookMap = new TreeMap<Integer, Integer>(); 
    bookMap.put(200, 2000);
    libraryMap = new TreeMap<Integer, TreeMap<Integer, Integer>>();
    libraryMap.put(10,bookMap);
    UserMap.put(1,libraryMap);
    UserMap.put(2,libraryMap);
    UserMap.put(3,libraryMap);

Решение № 1 все еще использует только карты, но я думаю, что это решение займет много времени и потребит больше памяти?

TreeMap<Integer, Integer> bookMap = new TreeMap<Integer, Integer>();
        TreeMap<Integer, TreeMap<Integer, Integer>> libraryMap = new TreeMap<Integer, TreeMap<Integer, Integer>>();
        TreeMap<Integer, TreeMap<Integer, TreeMap<Integer, Integer>>> UserMap = new TreeMap<Integer, TreeMap<Integer, TreeMap<Integer, Integer>>>();

        bookMap.put(100, 2000);
        bookMap.put(300, 2003);
        libraryMap.put(10,bookMap);     
        UserMap.put(1,libraryMap);
        UserMap.put(2,libraryMap);
        UserMap.put(3,libraryMap);

        int userID = 1;
        int libraryID =10;
        if (UserMap.containsKey(userID))
        {           
             if ( UserMap.get(userID).containsKey(libraryID))
             {
                 TreeMap<Integer, Integer> storedBookMap = UserMap.get(userID).get(libraryID);
                 bookMap= new TreeMap<Integer, Integer>();

                 bookMap.putAll(storedBookMap);
                 bookMap.put(200, 2000);

                 libraryMap = new TreeMap<Integer, TreeMap<Integer, Integer>>();
                 libraryMap.put(libraryID,bookMap); 

                 UserMap.put(userID,libraryMap);
             }
        }

Ответы [ 2 ]

3 голосов
/ 24 января 2012

каждый пользователь может иметь более одной книги, но когда вы делаете:

UserMap.put(1,libraryMap);

, вы перезаписываете то, что было в UserMap под клавишей 1.поэтому вы должны сделать UserMap типа TreeMap<Integer,ArrayList<whatever>> и добавить данные в список.

также нет смысла вкладывать карты.каждая сущность в вашей программе (пользователь / книга / библиотека) имеет идентификатор, поэтому я бы предложил сохранить одну карту для каждого типа сущности и использовать идентификаторы для справки.то есть:

TreeMap<Integer, Integer> bookMap = new TreeMap<Integer, Integer>();    
TreeMap<Integer, ArrayList<Integer>> userMap = new TreeMap<Integer, Integer>();

// for each line
  // read line and assign appropriate values to uid, libid, bid, year

  if (bookMap.get(bid) == null)
    bookMap.put(bid,year);

  if (userMap.get(uid) == null))
    userMap.put(uid, new ArrayList<Integer>());
  userMap.get(uid).add(bid);

Теперь, если вы хотите узнать, какие книги есть у пользователя 1, вы делаете что-то вроде:

for (Integer i: userMap.get(1))
  System.out.println(i+","+bookMap.get(i))
0 голосов
/ 25 января 2012

Если у вас есть возможность использовать произвольный код, рассмотрите возможность использования одной из коллекций Multimap, которая решает проблему, которую вы пытаетесь решить, гораздо приятнее, чем простая карта>> 1001 *

http://commons.apache.org/collections/api-3.1/org/apache/commons/collections/MultiMap.html

http://google -collections.googlecode.com / SVN / багажник / Javadoc / COM / Google / общие / собирать / Multimap.html

...