[英]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.