先摘抄一段Bag的说明
Bag是在org.apache.commons.collections包中定义的接口,它extends java.util.Collection,而它的实现类都被放在下面的bag包中。之所以有这样一组类型,是因为我们有时候需要在Collection中存放多个相同对象的拷贝,并且需要很方便的取得该对象拷贝的个数。需要注意的一点是它虽然extends Collection,但是如果真把它完全当作java.util.Collection来用会遇到语义上的问题,详细信息参考Javadoc。http://write.blog.youkuaiyun.com/postedit
HashBag是Bag接口的一个标准实现。而BagUtils提供一组static的方法让调用者获取经过不同装饰后的Bag实例。
例子:
package bag;
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 price;
public Book() {
}
public Book(String name, String isbn, double price) {
super();
this.name = name;
this.isbn = isbn;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).append("NAME" + name).append("isbn" + isbn).append("price" + price).toString();
}
}
package bag;
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 TestBag {
public static void main(String[] args) {
Book book1 = new Book("代码大全", "9787121022982", 102.40);
Book book2 = new Book("程序员修炼之道——从小工到专家", "9787121123368", 44.00);
Book book3 = new Book("编程珠玑(第2版)(20余年畅销不衰计算机科学的不朽经典)", "9787115179289", 29.20);
Bag myBag = BagUtils.typedBag(new HashBag(), Book.class);
myBag.add(book1, 1000);
myBag.add(book2, 200);
myBag.add(book3, 100);
int count1 = myBag.getCount(book1);
int count2 = myBag.getCount(book2);
int count3 = myBag.getCount(book3);
Double price1 = book1.getPrice();
Double price2 = book2.getPrice();
Double price3 = book3.getPrice();
System.out.println(StringUtils.center("书库里还有", 40,"*"));
System.out.println(book1.getName() + "--" + count1 + "本");
System.out.println(book2.getName() + "--" + count2 + "本");
System.out.println(book3.getName() + "--" + count3 + "本");
System.out.println("共计:" + (count1 * price1 + count2 * price2 + count3 * price3) + "元");
}
}
再摘抄段
这个Bag在我们需要处理类似仓库的系统中还是比较有用的,对于定义好的货品,可以用枚举,甚至简单点用String也是可以,然后就可以成批add和remove,并且直接获取当前数量进行盘点或者库存查询。如果没有Bag,我们需要for循环去add和remove。或者如果你实现的是一个Map,那么你在add和remove时还需要自己去判断是否已经有该货品存在,remove时甚至需要自己去检查库存是否够用等等。