如果我需要创建一个允许我存储书籍的集合以及流通的副本数量(对于图书馆),我应该使用哪种类型的集合?我会使用 ArrayList,但我也希望能够按发行年份的顺序对书籍进行排序。
4 回答
你可以用你所拥有的Book Class
一切来创建一个。并为此实现一个并在其中编写排序逻辑。attributes
book
Comparable
Book Class
维护一个List<Book>
, and useCollections.sort
方法,List
根据实现的Sorting
逻辑对你进行排序。
更新: -
就快速查找而言,aMap
始终是最好的选择。并且适合实现字典查找类型的结构。为此,您需要一些唯一标识每本书的属性。然后将您的书存储为Map<String, Book>
您key
可能属于id
的类型String
。
此外,在这种情况下,您的排序逻辑会发生一些变化。现在你必须根据你的Map's value
,即在的基础上attributes
进行排序Book
。
这是您可以使用的示例代码。我刚刚考虑过基于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);
}
}
输出: -
"{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 对象作为映射到副本数作为值的键。
好吧,如果您的集合的全部目的是存储书籍的数量,而不是字典/地图,或者调用任何 java 的键值集合。
它可能会title
作为你的密钥,count
作为你的价值。
现在我怀疑你的集合可能比这更复杂一些,所以你可能想要创建一个作为字段的Book
类Count
,然后我可能会有一个string
->Book
字典/地图,string
因为它是露水十进制编号或其他一些唯一标识符。
除了简单的教育或玩具项目之外,您还想使用数据库而不是内存中的集合。(不是真正的答案,但我认为值得说明。)