我想实现一个图书库,可以添加,删除和更新图书。此存储库中的书籍应通过其对象属性ISBN访问。
我应该使用列表还是地图?如果要使用地图,如何让密钥和值的属性保持同步?
答案 0 :(得分:0)
你可以使用这样的arraylist:
% Sample data
col = [1 1 1 2 2 2]'; % e.g. col = inputData(:,1)
row = [1 3 2 1 2 3]';
data = [11 12 13 14 15 16]';
% Using a loop: note that row and col must uniquely identify data
% preallocate output matrix
outMatrix = nan(max(row),max(col));
for i = 1:size(data,1)
outMatrix(row(i),col(i)) = data(i);
end
示例:
ArrayList<Book> myBooks = new ArrayList<Book>();
请注意,您需要Book类
中ISBN号的getter方法希望它有所帮助。祝你好运!
答案 1 :(得分:0)
地图有助于此
Map<String, Book> bookMap = new HashMap<String, Book>();
bookMap.put(book1.getIsbn(), book1);
bookMap.put(book2.getIsbn(), book2);
bookMap.put(book3.getIsbn(), book3);
bookMap.put(book4.getIsbn(), book4);
让密钥获得Book
。
答案 2 :(得分:0)
地图似乎是一种方法,因为它会照顾你的收藏搜索。如果您要查找isbn的书籍,我建议使用Map,因为它的搜索具有O(1)性能,而通过List搜索具有O(n)意味着对于大量书籍,Map将表现更好。< / p>
另一方面,如果您出于某种原因使用List实现(也许您需要线性数据表示,或者您需要知道添加的Book对象的顺序)那么我建议您也查看到Set Collection实现,因为它可以帮助你处理重复项。
此外,请记住,这将暂时存储数据 ,这意味着程序终止时所有数据都将丢失。如果您需要保持数据完好无损,那么您应该使用Java查看持久数据 - 将数据存储到文件中,拥有数据库,甚至向其发送可以保存数据的Web服务。
最灵活的解决方案是让代码安静,处理选择您(或您的用户)所需的存储类型的逻辑。这可以通过使用具有您需要的所有方法(如读取,更新,删除)的接口和实现该接口的单独类来实现。
下面是一个示例接口和2个实现,一个用于Map,另一个用于数据库(仅限模拟)
接口:
public interface IBookRepository{
boolean addBook(Book book);
void removeBook(Book book);
void removeBookWithIsbn(String isbn);
void editBook(Book bookWithNewProperties);
void editBookTitle(String isbn, String title);
}
地图实施:
public MapBookRepository() implements IBookRepository{
private HashMap<String, Book> mBookMap;
public MapBookRepository(){
this.mBookMap = new HashMap<String, Book>();
}
public boolean addBook(Book book){
if(!mBookMap.containsKey(book.isbn)){
return mBookMap.put(book.isbn, book);
}
return false;
}
public void removeBook(Book book){
RemoveBookWithIsbn(book.isbn);
}
public void removeBookWithIsbn(String isbn){
if(mBookMap.containsKey(book.isbn)){
remove(book.isbn);
}
}
public void editBook(Book bookWithNewProperties){
removeBookWithIsbn(bookWithNewProperties.isbn);
addBook(bookWithNewProperties);
}
public void editBookTitle(String isbn, String title){
if(mBookMap.containsKey(isbn)){
mBookMap.get(isbn).setTitle(title); // You need a setter in your Book Class
}
}
}
数据库实现(仅限mock ..):
public DbBookRepository() implements IBookRepository{
public DbBookRepository(){
// Db stuff
}
public boolean addBook(Book book){
// Db stuff
}
public void removeBook(Book book){
// Db stuff
}
public void removeBookWithIsbn(String isbn){
// Db stuff
}
public void editBook(Book bookWithNewProperties){
// Db stuff
}
public void editBookTitle(String isbn, String title){
// Db stuff
}
}
使用示例可能是:
public static void main(String [] args)
{
if(args.length != 1){
return;
}
IBookRepository repo;
if(args[0].equal("DB")){
repo = new DbBookRepository();
}else if (args[0].equal("Map")){
repo = new MapBookRepository();
}else{
return;
}
repo.addBook(new Book("a", "b", "c", 1.0));
}
答案 3 :(得分:-1)
你可以在你的pojo类中使用getter和setter方法来实现这个目的。
books.add(book1);
插入
book1.getBookName(book1.setBookName("name"));
这里book1是Book类对象
更新
books.remove(1);
删除
{{1}}
删除取得图书对象的索引值
答案 4 :(得分:-1)
我将在图书库中使用HashMap
。当我想将一本书添加到存储库时,我将添加该书的副本而不是引用,因此无法在存储库之外进行修改。这同样适用于更新和获取书籍。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class BookRepository {
private Map<String, Book> books;
public BookRepository() {
this.books = new HashMap<>();
}
public Book get(String isbn) {
Book copy = null;
if (this.books.containsKey(isbn))
copy = new Book(this.books.get(isbn));
return copy;
}
public boolean add(Book book) {
Book copy = new Book(book);
return this.books.putIfAbsent(copy.getIsbn(), copy) == null;
}
public boolean remove(String isbn) {
return this.books.remove(isbn) != null;
}
public boolean update(Book book) {
Book copy = new Book(book);
return this.books.computeIfPresent(copy.getIsbn(), (isbn, existing) -> copy) != null;
}
public List<Book> getAll() {
List<Book> list = new ArrayList<>();
for (Book book : this.books.values())
list.add(new Book(book));
return list;
}
public void removeAll() {
this.books.clear();
}
}