Do you not want something as simple as this?
Map> m = {};
for (Book b : books) {
for (tag t : b.taglist) {
m.get(t).add(b);
}
}
Now m.get("IT")
will return all IT books, etc...
Sure some books will appear in multiple categories, but that happens in real life, too...