[英]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)
。 它返回对象,所以我可以对其进行修改。 一切都很好,但是HashSet
比TreeSet
快得多。 所以问题是,是否存在某种HashSet
可以返回特定对象,例如是否正在实现NavigableSet
? 还是我应该以某种方式重写我的代码? 将不胜感激。
HashSet
更快的原因是它没有排序。 需要对NavigableSet
进行排序,并且任何实现都必须在保持集合有序方面有一些开销。 TreeSet
可能是可用的最佳通用排序集实现,如果您需要NavigableSet
带来的功能,则需要支付性能成本。 我很怀疑在任何情况下设置查找的开销都是程序的症结所在。
在NavigableSet
Javadoc中,
所有已知的实现类: ConcurrentSkipListSet
, TreeSet
而且由于散列函数会破坏任何自然顺序,因此我认为使用基本散列将无法实现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.