簡體   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