【问题标题】:Is there HashSet which implements NavigableSet in Java?是否有在 Java 中实现 NavigableSet 的 HashSet?
【发布时间】:2014-10-22 04:03:37
【问题描述】:

我需要解析一些网站以获取用户列表及其帖子。 用户由 UserIds 表示,帖子由 PostIds 表示,它们实际上是整数。 所以我为这样的用户创建了一个类:

class User {
    private int userId;
    private List<Integer> postList;
    //...
}

然后我遇到了一个问题。 该站点提供了一个 api,它返回一个帖子结构列表,如:

class Post {
    int postId;
    int postAuthorId;
    String postText;
    //...
}

所以我应该得到一个帖子,搜索我的用户集中是否已经有帖子作者(用户),如果没有,则将新用户和帖子 ID 添加到用户集,如果是 - 将帖子 ID 添加到该用户的列表中帖子。 首先我想使用HashSet - 因为快速添加和搜索方法。但后来我意识到我无法从HashSet 获得所需的用户。接下来我想到了TreeSet,它实现了NavigableSet,所以我可以使用TreeSet.ceiling(user)。它返回对象,所以我可以修改它。一切都很好,但HashSetTreeSet 快得多。 所以问题是,如果有某种HashSet 可以返回特定的对象,比如它是否正在实现NavigableSet? 或者我应该以某种方式重写我的代码?将不胜感激。

【问题讨论】:

  • 所以你想通过用户访问HashSet?
  • 您是否有理由不使用将用户 ID 映射到用户的 HashMap
  • @Compass 谢谢你的好主意,我是集合实际使用的新手,地图对我的目的真的很有用!

标签: java collections hashset


【解决方案1】:

HashSet 更快的原因是它没有排序。 NavigableSet 需要排序,并且任何实现都必然会有一些开销来保持集合的有序性。 TreeSet 可能是最好的通用排序集实现,如果你需要NavigableSet 带来的特性,你需要付出性能成本。我非常怀疑集合查找中的开销无论如何都是您程序中的症结所在。

【讨论】:

    【解决方案2】:

    作为我评论的扩展,这听起来像是 HashMap 的实际用途。您可以使用 User 中的用户 id 作为键,并映射到 User 对象。使用您提供给我们的内容,以下代码将填充用户 HashMap。

    HashMap<Integer, User> users = new HashMap<>();
    
    for(Post post : posts) {
        int userId = post.getPostAuthorId();
        if(users.get(userId) != null) {
            users.get(userId).addPost(post);
        }
        else {
            users.put(userId, new User(userId));
        }
    }
    

    【讨论】:

    • 是的,这个最合适!谢谢!
    【解决方案3】:

    来自NavigableSetJavadoc,

    所有已知的实现类: ConcurrentSkipListSet, TreeSet

    而且由于散列函数会破坏任何自然排序,我认为 NavigableSet 使用基本散列是不可能的。

    【讨论】:

      【解决方案4】:

      您可能应该将用户列表和帖子列表分开。然后使用适合您目的的地图来关联它们。如果您使用 hibernate 之类的东西,您将能够继续将它们用作 POJO 并从中获得持久性。

      如果您想将帖子保留在用户内部,您可能还需要重写 User 类的 Hash 函数,以便仅通过用户 ID 而不是帖子来标识该类。 (以及重写equals

      更多内容在这里Why is the default hashcode() in java bad?

      【讨论】:

        猜你喜欢
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 2014-03-05
        • 2012-10-30
        • 2014-01-17
        • 2011-03-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多