2012-11-05 54 views
0

如果我需要創建一個允許我存儲書籍的集合以及有多少份正在流通(對於圖書館),我應該使用什麼類型的集合? 我會使用ArrayList,但我也希望能夠按問題年份排序。要使用哪個集合?

回答

3

您可以創建一個Book Class與所有attributes你有一個book。併爲此Book Class實施Comparable並在那裏寫入排序邏輯。

維護List<Book>,並使用Collections.sort方法,按照實施的Sorting邏輯對List進行排序。

更新: -

至於,快速查找而言,一個Map永遠是最好的選擇。並且適用於實現字典查找類結構。爲此,您需要一些可以唯一標識每本書的屬性。然後將您的圖書存儲爲Map<String, Book>,其中您的key可能是String類型的id

此外,在這種情況下,你的排序邏輯會改變一點。現在您必須根據您的Map's value進行排序,即基於Bookattributes

下面是您可以使用的示例代碼。我剛剛考慮根據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]}" 
+0

我會懷疑圖書館需要一本書的O(n)查找時間。列表提供O(n) –

+0

@ColinD。那麼,爲了查找目的,'Map'當然是一個理想的數據結構。但排序需要一個'List'。 –

+0

TreeMaps排序。 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/SortedMap.html –

0

java.util.TreeMap中可用於索引和排序這樣的要求。

檢查http://docs.oracle.com/javase/6/docs/api/java/util/TreeMap.html瞭解更多詳情。

您可以使用您的Book對象作爲映射到拷貝數的鍵值作爲值。

+1

TreeMap不能用於此需求。您不能將'發行年份'作爲您的地圖的關鍵字。並且TreeMap排序在'key'上。 –

+0

您可以使用The Book作爲關鍵字,將Issue Year作爲其中的一個字段,並將每個Book的值作爲每個Book的值。這將與需求相匹配,並且可以靈活地根據需要更改書籍進行分類。 –

+0

但是,然後,需要重寫Book類中的'HashCode'和'equals'方法,其邏輯不會破壞合約。你爲初學者工作。將'String'作爲啓動地圖的關鍵字會更好。 –

0

那麼,如果你的集合的全部目的是存儲書籍的數量,那麼比字典/地圖或者任何java的鍵值集合都要被調用。

它可能會有title作爲您的鑰匙,而count作爲您的價值。

現在我懷疑您的收藏可能會有點複雜多了,所以你可能要做出Book類具有Count作爲一個字段,然後我可能有一個string - >Book詞典/圖無論如何,與string,因爲它是十足的十進制數或其他一些獨特的標識符。

0

除了一個簡單的教育或玩具項目,你想要使用數據庫而不是內存集合。 (不是真的答案,但我認爲值得說明。)