You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多索引映射最优结构选型及Java实现优化咨询

问题

多索引映射需求:

  • 一个值对应多个键,可通过键在亚线性时间(小于O(n))内查找值。
  • 键非唯一,即存在key1: val1、key1: val2、key1: val3的情况。
  • 删除值时,需从映射中移除所有对应该值的键值对。
示例

Book队列结构

  • Book对应多个作者,可快速通过作者查找书籍。
  • Book可并发添加或移除至队列。
  • 一个作者可撰写多本Book。

处理流程

  • 输入作者名称,查找队列中的任意一本对应书籍。
  • 将该书籍从队列中移除。

我曾考虑使用类似multimap的结构,但遍历书籍作者时从映射中删除键值对的方案并不合适,当作者和书籍总数达百万级时,耗时会显著增加。

能否有人帮我确定合适的结构?

更新:

按照@gdomo的建议(书籍-作者、作者-书籍双向映射),我编写了如下Java代码:

public class Book {
    ...
    private List<String> authors;
}

Set<Book> pendingBooks = ConcurrentHashMap.newKeySet();

ConcurrentHashMap<String, Set<Book>> cacheMapBooksByAuthor = new ConcurrentHashMap<>();

public static void processAuthorCheck(String author) {
    Set<Book> books = cacheMapBooksByAuthor.put(author, ConcurrentHashMap.newKeySet());
    if (books == null)
        return;

    for (Book book : books) {
        pendingBooks.remove(book);          // 从队列中移除书籍

        this.processBook(book); // TODO

        List<String> authors = book.getAuthors();
        if (authors == null)
            continue;
        for (String author : authors) {
            cacheMapBooksByAuthor.get(author).remove(book);        // 从其他作者的映射中移除该书
        }
    }
}

public static void pushBook(Book book) {
    List<String> authors = book.getAuthors();
    if (authors == null)
        return;

    for (String authors : authors) {
        Set<Book> books = cacheMapBooksByAuthor.get(authors);
        if (books == null) {
            Set<Book> oldBooks = cacheMapBooksByAuthor.putIfAbsent(authors, books = ConcurrentHashMap.newKeySet());
            if (oldBooks != null)
                books = oldBooks;
        }
        books.add(book);
    }
}

我使用Set替代Queue以避免书籍冲突。

但我不满意的一点是,在Java中释放Book变量不会影响作者映射中的Book引用(因Java对象引用机制)。

是否有比该结构更优的解决方案?


内容的提问来源于stack exchange,提问作者coding monster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:53:27