我有一份作者列表,其中包含该书的标题和出版年份,例如:
Brian Goetz,Tim Peierls,Joshua Bloch,Joseph Bowbeer,David Holmes,Doug Lea:Java Concurrency in Practice,2006
Ken Arnold,James Gosling和David Holmes:Java Programming Language,2005
... 的
我想知道什么样的数据结构最适合存储有关共同作者的信息,他们一起写的书以及出版年份。
我想稍后使用这些信息绘制图形(在JUNG中,我正在使用java),其中每个作者都是节点,边缘将是他们共同撰写的每本书。每年都会绘制单独的图表。我在考虑使用multimap:
Map<Year, Map<Author, List<Map<Co-author, Title>>>>
但也许这太复杂了?
提前感谢您的帮助。
答案 0 :(得分:2)
如何将一组作者和标题放在一个名为“Book”的对象中?这样,您的数据结构可能只是
class Book {
List<Author> authors;
Title title;
}
Map<Year, Set<Book>> booksInYears
图形绘制算法可以这样工作:
for (Book book : booksInYears.get(aYear))
for (Author author1 : book.authors)
for (Author author2 : book.authors)
if (author1 != author2)
drawEdge(author1, author2, book.title);
drawEdge
方法首先检查两个作者是否已经绘制了相应的节点(例如,使用包含已绘制节点的作者的集合,或者可能是作者=&gt;节点图)并绘制所需的节点,然后在它们之间划清界限。
答案 1 :(得分:1)
只需创建一个JUNG图形; JUNG将处理数据结构。也就是说,节点将是作者,边缘将是共同作者关系(其中包含有关工作的信息)。
也就是说,在过去使用过共同作者图表时,您可能希望将共同作者的更自然的表示视为二分图(作者与作品)或超图。这样您就不需要多次冗余地表示工作了。
答案 2 :(得分:0)
我认为这样构建数据是一个坏主意,为什么不使用多态概念呢?
为什么不创建Class Book
,包含发布年份,名称等内容。
比创建Class Author
之类的另一个实体,并在两个 Book 之间构建将包含List<Author>
coAuthors,作者可以包含List<Book>