簡體   English   中英

Sorted Array vs Hashtable:在日歷應用程序中搜索一系列日期時,哪種數據結構更有效?

[英]Sorted Array vs Hashtable: Which data structure would be more efficient in searching over a range of dates in a calendar app?

我有大約一年的Java編碼經驗。 為了磨練我的技能,我正在嘗試用Java編寫日歷/日記條目桌面應用程序。 我已經意識到我仍然沒有數據持久性的經驗,但仍然不能真正理解數據持久性選項對於這個程序是什么 - 所以也許我正在跳槍,以及我希望的設計選擇一旦我進入細節,實施甚至都不適用。

我主要想編寫一個日歷應用程序,它允許您記錄日常日記條目以及相關活動日志,以了解日常任務所花費的時間。 在添加,編輯和查看日記條目方面,使用哈希表將條目的日期作為鍵,條目本身作為值似乎最有效率(每個使用哈希表的O(1)平均情況)。

但是,我也希望實現一個功能,在給定一定范圍的日期的情況下,可以對每天在某些任務上花費的平均時間進行簡單分析。 如果這是我感興趣的主要功能之一,我認為排序的數組可能更有效率是錯誤的嗎? 特別是考慮到通常預期數據條目已經按日期添加。

或許還有另一個我不知道的選擇?

我問的原因是因為以下問題提供了答案: 為什么不使用散列/哈希表來處理所有事情?

我不確定我是否提出正確的問題的原因是因為以下問題的答案: 日歷/日計划員的最佳數據結構是什么?

如果是這樣,我真的很感激在java中引導數據持久性的其他資源。

感謝您的幫助!

使用NavigableMap接口(由TreeMap實現,一種紅黑樹)。

這使您可以輕松有效地選擇日期范圍並按關鍵順序遍歷事件。

順便說一句,如果你認為時間或日期的間隔是“半開放”的話,那么很容易讓很多問題變得容易。 也就是說,在選擇事件時,在結果中包含下限,但排除上限。 NavigableMap的方法,如subMap() ,設計為以這種方式工作,當您處理任意數量的間隔時,這是一個很好的做法,因為很容易定義一個沒有重疊或間隙的間隔序列。

取決於您希望項目的嚴肅程度。 在所有情況下,請注意過早優化 這是當你努力使你的代碼“高效”,並在此過程中犧牲可讀性/可維護性時。 例如,可能有一種方法可以使用本機代碼進行手動內存管理,以便更有效地實現日歷的數據結構,但它可能不會超過使用熟悉的API等的好處。它可能會這樣做,但是你只有在運行代碼時才知道。

  1. 寫可讀代碼
  2. 運行它,測試性能問題
  3. 使用分析器(例如JProfiler)來識別導致性能不佳的代碼
  4. 優化該代碼
  5. 重復

對於將“工作”但不具有可擴展性的代碼,簡單的List通常可以正常工作。 您可以使用JSON存儲對象,使用Jackson Databind等庫來映射List和JSON。 然后,您可以將其保存到文件中以保持持久性。

對於您希望更強大並且防止數據損壞的應用程序,數據庫可能更好。 通過這種方式,您可以保證,例如,數據不是部分寫入的,對同一數據的並發訪問不會導致損壞,還有許多其他好處。 但是,您需要在應用程序旁邊運行數據庫服務器。 您可以為數據庫供應商(例如Mysql)使用JDBC和合適的驅動程序來連接,讀取和寫入數據庫。

對於嚴肅的應用程序,您可能希望為持久性創建API。 像Spring這樣的框架非常有用,因為它允許您使用注釋聲明REST端點,並引入了有用的編程概念,例如容器,IoC /依賴注入,測試(單元測試和集成測試),JPA / ORM系統和更多。

就像我說的,這是所有依賴於上下文的,但最重要的是, 避免過早優化

如果您正在使用(或能夠使用)Guava,您可以考慮使用RangeMap (*)。

這將允許您使用RangeMap<Instant, Event> ,然后您可以查詢“在時間T發生了什么事件”。

一個缺點是您無法對並發事件進行建模(例如,當您在兩次會議中雙重預訂時)。


(*)我在Google工作,Guava是Google的開源Java庫。 這是我將使用的庫,但其他具有相似范圍映射的庫可用。

該線程可能會為您提供一些用於范圍查詢的數據結構的想法。

范圍查詢的數據結構

甚至可能更容易使用數據庫並使用API​​來查詢所需的范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM