Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在树映射中初始化数据_Java_Treemap - Fatal编程技术网

Java 在树映射中初始化数据

Java 在树映射中初始化数据,java,treemap,Java,Treemap,给定数据,例如: 用户,图书馆ID,图书ID,年份 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

给定数据,例如: 用户,图书馆ID,图书ID,年份

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);
TreeMap bookMap=newtreemap();
TreeMap libraryMap=newtreemap();
TreeMap UserMap=newtreemap();
bookMap.put(1002000);
图书馆地图(10,图书地图);
UserMap.put(1,libraryMap);
UserMap.put(2,libraryMap);
UserMap.put(3,libraryMap);
bookMap=newtreemap();
bookMap.put(2002000);
libraryMap=新树映射();
图书馆地图(10,图书地图);
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);
             }
        }
TreeMap bookMap=newtreemap();
TreeMap libraryMap=newtreemap();
TreeMap UserMap=newtreemap();
bookMap.put(1002000);
bookMap.put(3002003);
图书馆地图(10,图书地图);
UserMap.put(1,libraryMap);
UserMap.put(2,libraryMap);
UserMap.put(3,libraryMap);
int userID=1;
intlibraryId=10;
if(UserMap.containsKey(userID))
{           
if(UserMap.get(userID.containsKey(libraryID))
{
TreeMap storedBookMap=UserMap.get(userID).get(libraryID);
bookMap=newtreemap();
bookMap.putAll(storedBookMap);
bookMap.put(2002000);
libraryMap=新树映射();
libraryMap.put(libraryID,bookMap);
put(userID,libraryMap);
}
}

每个用户都可以拥有多本书,但当您这样做时:

UserMap.put(1,libraryMap);
您可以覆盖键
1
下的
UserMap
中的任何内容。因此,您应该将
UserMap
设置为
TreeMap
类型,并将数据添加到列表中

此外,嵌套地图也没有意义。程序中的每个实体(用户/书籍/库)都有一个id,因此我建议为每种类型的实体保留一个映射,并使用id作为参考。i、 e:

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);

如果您有使用任意代码的优点,请考虑使用一个MultMAP集合,它处理您要解决的问题比原始映射>

好得多。


数据按上述示例顺序存储,因此我需要逐行读取数据并添加/放入。我还需要添加库Id,它是10,在这种情况下,原始问题的答案仍然有效(使用列表,每个用户需要保留几个值)。我已经更新了答案的第二部分,以便逐行读取数据。库ID的处理方式应该类似,请尝试找出它。请检查更新解决方案#1好吗?运行它会比使用列表花费更多的时间和内存吗?我想检查一下您自己认为不好的解决方案,并且完全忽略我迄今为止提出的所有建议吗?不,谢谢。请不要难过,我是新来的地图和列表广告仍然在练习。谢谢,实际上,我会在这里使用Table,而不是Multimap。它在幕后只是将您的调用代理到MapK、CollectionV,所以开销基本上是多了一个函数调用,这是最小的-但它提供了一个更干净的接口。简单的map.put(键、值);vs.if(!map.containsKey(key)){map.put(key,newarraylist())};map.get(key)、add(value)@LouisWasserman-我错过了那里有几个用例(因为我没有越过第一行)
for (Integer i: userMap.get(1))
  System.out.println(i+","+bookMap.get(i))