如果我需要創建一個允許我存儲書籍的集合以及有多少份正在流通(對於圖書館),我應該使用什麼類型的集合? 我會使用ArrayList,但我也希望能夠按問題年份排序。要使用哪個集合?
要使用哪個集合?
回答
您可以創建一個Book Class
與所有attributes
你有一個book
。併爲此Book Class
實施Comparable
並在那裏寫入排序邏輯。
維護List<Book>
,並使用Collections.sort
方法,按照實施的Sorting
邏輯對List
進行排序。
更新: -
至於,快速查找而言,一個Map
永遠是最好的選擇。並且適用於實現字典查找類結構。爲此,您需要一些可以唯一標識每本書的屬性。然後將您的圖書存儲爲Map<String, Book>
,其中您的key
可能是String
類型的id
。
此外,在這種情況下,你的排序邏輯會改變一點。現在您必須根據您的Map's value
進行排序,即基於Book
的attributes
。
下面是您可以使用的示例代碼。我剛剛考慮根據id
進行排序。您可以根據需要更改排序邏輯: -
class Book {
private int id;
private String title;
public Book() {
}
public Book(int id, String title) {
this.id = id;
this.title = title;
}
@Override
public String toString() {
return "Book[Title:" + this.getTitle() + ", Id:" + this.getId() + "]";
}
// Getters and Setters
}
public class Demo {
public static void main(String[] args) {
final Map<String, Book> map = new HashMap<String, Book>() {
{
put("b1", new Book(3, "abc"));
put("b2", new Book(2, "c"));
}
};
List<Map.Entry<String, Book>> keyList = new LinkedList<Map.Entry<String, Book>>(map.entrySet());
Collections.sort(keyList, new Comparator<Map.Entry<String, Book>>() {
@Override
public int compare(Map.Entry<String, Book> o1, Map.Entry<String, Book> o2) {
return o1.getValue().getId() - o2.getValue().getId();
}
});
Map<String, Book> result = new LinkedHashMap<String, Book>();
for (Iterator<Map.Entry<String, Book>> it = keyList.iterator(); it.hasNext();) {
Map.Entry<String, Book> entry = it.next();
result.put(entry.getKey(), entry.getValue());
}
System.out.println(result);
}
}
OUTPUT: -
"{b2=Book[Title:c, Id:2], b1=Book[Title:abc, Id:3]}"
java.util.TreeMap中可用於索引和排序這樣的要求。
檢查http://docs.oracle.com/javase/6/docs/api/java/util/TreeMap.html瞭解更多詳情。
您可以使用您的Book對象作爲映射到拷貝數的鍵值作爲值。
TreeMap不能用於此需求。您不能將'發行年份'作爲您的地圖的關鍵字。並且TreeMap排序在'key'上。 –
您可以使用The Book作爲關鍵字,將Issue Year作爲其中的一個字段,並將每個Book的值作爲每個Book的值。這將與需求相匹配,並且可以靈活地根據需要更改書籍進行分類。 –
但是,然後,需要重寫Book類中的'HashCode'和'equals'方法,其邏輯不會破壞合約。你爲初學者工作。將'String'作爲啓動地圖的關鍵字會更好。 –
那麼,如果你的集合的全部目的是存儲書籍的數量,那麼比字典/地圖或者任何java的鍵值集合都要被調用。
它可能會有title
作爲您的鑰匙,而count
作爲您的價值。
現在我懷疑您的收藏可能會有點複雜多了,所以你可能要做出Book
類具有Count
作爲一個字段,然後我可能有一個string
- >Book
詞典/圖無論如何,與string
,因爲它是十足的十進制數或其他一些獨特的標識符。
除了一個簡單的教育或玩具項目,你想要使用數據庫而不是內存集合。 (不是真的答案,但我認爲值得說明。)
- 1. 要使用哪個地圖/集合?
- 2. 要使用哪個java集合?
- 3. 要使用哪種通用集合?
- 4. 要使用哪種集合類型?
- 5. 在集合中查找元素的索引,要使用哪個集合?
- 6. 要使用哪個集合類:散列表或字典?
- 7. C#數據結構問題(要使用哪個集合?)
- 8. 要使用哪個連續集成庫?
- 9. 在Java中使用哪個集合?
- 10. 我應該使用哪個集合
- 11. 我可以使用哪個java集合?
- 12. Java收藏集:哪個集合使用什麼時候?
- 13. 哪個程序集要引用DataGrid?
- 14. 使用變量來確定要打印的集合中的哪個值
- 15. Android集合,我應該使用哪些?
- 16. 應該在哪裏使用System.Collections.Concurrent集合?
- 17. 哪個集合斷言策略與TestCaseSource集合返回值一起使用
- 18. 子集使用哪個()
- 19. 要使用哪個endpointscfg.py?
- 20. 哪個Catch Execption要使用?
- 21. 要使用哪個SmtpStatusCodes?
- 22. 要使用哪個Exception類?
- 23. 要使用哪個SQLite.net PCL?
- 24. 要使用哪個數組?
- 25. 要使用哪個Android API?
- 26. 要使用哪一個mysqli_ *?
- 27. 要使用哪個CMS?
- 28. 要使用哪個CMS?
- 29. 要使用哪一個REGEXP
- 30. 要使用哪個WM_Message?
我會懷疑圖書館需要一本書的O(n)查找時間。列表提供O(n) –
@ColinD。那麼,爲了查找目的,'Map'當然是一個理想的數據結構。但排序需要一個'List'。 –
TreeMaps排序。 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/SortedMap.html –