繁体   English   中英

是否有HashSet在Java中实现NavigableSet?

[英]Is there HashSet which implements NavigableSet in Java?

我需要解析一些网站以获取用户及其帖子列表。 用户用UserId表示,帖子用PostId表示,它们实际上是整数。 因此,我为用户创建了一个类,如下所示:

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

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

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

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

HashSet更快的原因是它没有排序。 需要对NavigableSet进行排序,并且任何实现都必须在保持集合有序方面有一些开销。 TreeSet可能是可用的最佳通用排序集实现,如果您需要NavigableSet带来的功能,则需要支付性能成本。 我很怀疑在任何情况下设置查找的开销都是程序的症结所在。

NavigableSet Javadoc中,

所有已知的实现类: ConcurrentSkipListSetTreeSet

而且由于散列函数会破坏任何自然顺序,因此我认为使用基本散列将无法实现NavigableSet

作为我的评论的扩展,这听起来像是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));
    }
}

您应该将用户列表和帖子列表分开。 然后使用适合您目的的地图进行关联。 如果您使用类似休眠的方式,则可以继续将它们用作POJO,并从中获得持久性。

如果要将帖子保留在用户内部,则可能还会重写User类的Hash函数,以便仅由userID(而不是帖子)对类进行ID。 (以及重写equals

这里的更多信息为什么Java中的默认hashcode()不好?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM