使用哪个系列?

时间:2012-11-05 19:21:49

标签: java collections

如果我需要创建一个可以存储书籍的集合以及流通中有多少副本(对于图书馆),我应该使用哪种集合?         我会使用ArrayList,但我也希望能够按照发行年份的顺序对书籍进行排序。

4 个答案:

答案 0 :(得分:3)

您可以使用Book Class的所有attributes创建book。并为Comparable实现Book Class并在其中编写排序逻辑。

维护List<Book>并使用Collections.sort方法,根据已实施的List逻辑对Sorting进行排序。

更新: -

就快速查询而言,Map总是最好的选择。并且适合实现字典查找类结构。为此,您需要一些唯一标识每本书的属性。然后将您的图书存储为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]}"

答案 1 :(得分:0)

java.util.TreeMap可用于索引和排序此类需求。

查看http://docs.oracle.com/javase/6/docs/api/java/util/TreeMap.html了解详情。

您可以将Book对象用作映射到副本数量的键作为值。

答案 2 :(得分:0)

好吧,如果你的集合的整个目的是存储书籍的数量,而不是字典/地图,或者调用任何java的键值集合。

它可能以title为密钥,count为您的值。

现在我怀疑你的收藏可能比这更复杂,所以你可能想要一个Book类,其中Count为一个字段,然后我可能会有一个string - &gt;无论如何Book字典/地图,string,因为它是露水十进制数字或其他一些唯一标识符。

答案 3 :(得分:0)

除了简单的教育或玩具项目之外,您还希望使用数据库而不是内存中的集合。 (不是真正的答案,但我认为值得说明。)