Read Sean

Read me, read Sean.
posts - 508, comments - 655, trackbacks - 9, articles - 4

[Jakarta Commons笔记] Commons Collections - Bag组

Posted on 2005-08-03 12:36 laogao 阅读(2412) 评论(2)  编辑  收藏 所属分类: On Java

 

首先来看Bag组。

 

Bag

HashBag

BagUtils

 

Bag是在org.apache.commons.collections包中定义的接口,它extends java.util.Collection,而它的实现类都被放在下面的bag包中。之所以有这样一组类型,是因为我们有时候需要在Collection中存放多个相同对象的拷贝,并且需要很方便的取得该对象拷贝的个数。需要注意的一点是它虽然extends Collection,但是如果真把它完全当作java.util.Collection来用会遇到语义上的问题,详细信息参考Javadoc

 

HashBagBag接口的一个标准实现。而BagUtils提供一组static的方法让调用者获取经过不同装饰后的Bag实例。

 

还是举例子来看:

 

/** Book.java */

 

package sean.study.commons.collections;

 

import org.apache.commons.lang.builder.ToStringBuilder;

import org.apache.commons.lang.builder.ToStringStyle;

 

public class Book {

   

    private String name;

    private String isbn;

    private double retailPrice;

   

    public Book() {

    }

   

    public Book(String name, String isbn, double retailPrice) {

        this.name = name;

        this.isbn = isbn;

        this.retailPrice = retailPrice;

    }

   

    public String toString() {

        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)

        .append("name", name)

        .append("ISBN", isbn)

        .append("retailPrice", retailPrice)

        .toString();

    }

 

    public String getIsbn() {

        return isbn;

    }

 

    public void setIsbn(String isbn) {

        this.isbn = isbn;

    }

 

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

 

    public double getRetailPrice() {

        return retailPrice;

    }

 

    public void setRetailPrice(double retailPrice) {

        this.retailPrice = retailPrice;

    }

   

}

 

/** BagUsage.java */

 

package sean.study.commons.collections;

 

import org.apache.commons.collections.Bag;

import org.apache.commons.collections.BagUtils;

import org.apache.commons.collections.bag.HashBag;

import org.apache.commons.lang.StringUtils;

 

public class BagUsage {

 

    public static void main(String[] args) {

        demoBagUsage();

    }

 

    public static void demoBagUsage() {

 

        System.out.println(StringUtils.center(" demoBagUsage ", 40, "="));

 

        // data setup

        Book book1 = new Book("Refactoring Workbook", "7-5083-2208-8", 29.8);

        Book book2 = new Book("J2EE Design Patterns", "7-5083-3099-4", 45);

        Book book3 = new Book("Agile Software Development", "7-5083-1503-0", 59);

 

        // create a bag

        Bag myBag = BagUtils.typedBag(new HashBag(), Book.class);

        myBag.add(book1, 360);

        myBag.add(book2, 500);

        myBag.add(book3, 170);

 

        // calculations for a bag

        double price1 = book1.getRetailPrice();

        double price2 = book2.getRetailPrice();

        double price3 = book3.getRetailPrice();

        int book1Count = myBag.getCount(book1);

        int book2Count = myBag.getCount(book2);

        int book3Count = myBag.getCount(book3);

        double totalValue = (price1 * book1Count) + (price2 * book2Count)

                + (price3 * book3Count);

 

        // dispaly results

        System.out.println("There are " + book1Count + " copies of "

                + book1.getName() + ".");

        System.out.println("There are " + book2Count + " copies of "

                + book2.getName() + ".");

        System.out.println("There are " + book3Count + " copies of "

                + book3.getName() + ".");

        System.out.println("The total value of these books is: " + totalValue);

 

        System.out.println();

 

    }

 

}

 

以下是运行结果:

 

============= demoBagUsage =============

There are 360 copies of Refactoring Workbook.

There are 500 copies of J2EE Design Patterns.

There are 170 copies of Agile Software Development.

The total value of these books is: 43258.0

 

需要说明的是,以上的代码仅仅为了演示如何使用Bag,实际应用不建议像这样硬编码。

 

 

Feedback

# re: [Jakarta Commons笔记] Commons Collections - Bag组  回复  更多评论   

2005-08-03 19:03 by emu
想不出什么情形下需要用到。

# re: [Jakarta Commons笔记] Commons Collections - Bag组  回复  更多评论   

2005-08-04 09:13 by 大胃
其实这个Bag接口对应的是一个已经有较明确定义的一种数据结构:
http://www.nist.gov/dads/HTML/bag.html

以往我们用Collection接口,或者是预定义的Map、List等,甚至是我们自己用数组实现的结构实际上都可以模拟出这个bag数据结构的行为。但是这样做并不方便。Bag为我们提供了便利。

我能够想到的是,这个Bag在我们需要处理类似仓库的系统中还是比较有用的,对于定义好的货品,可以用枚举,甚至简单点用String也是可以,然后就可以成批add和remove,并且直接获取当前数量进行盘点或者库存查询。如果没有Bag,我们需要for循环去add和remove。或者如果你实现的是一个Map,那么你在add和remove时还需要自己去判断是否已经有该货品存在,remove时甚至需要自己去检查库存是否够用等等。

Bag只是提供一些便利,如果你需要类似的功能,觉得好用,就用它,不好用的话,自己实现咯。

只有注册用户登录后才能发表评论。


网站导航: