使用map或list来存储对象属性应该访问的对象?

时间:2017-06-17 07:36:39

标签: java

我想实现一个图书库,可以添加,删除和更新图书。此存储库中的书籍应通过其对象属性ISBN访问。

我应该使用列表还是地图?如果要使用地图,如何让密钥和值的属性保持同步?

5 个答案:

答案 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();
    }
}