public class BBag extends BSet {

  public BBag(int size) {
    super(size);
    count = new int[size];
  }
  
  public void add(int el) {
    int i;
    for (i=0; (i<nelt)&&(elts[i]!=el); ++i);
    if(nelt < nmax) {
      if(i==nelt) {
	elts[i]=el;
	count[i]=1;
	nelt++;
      }
      else 
	count[i]++;
    }
  }

  public void add_many(int el, int num) {
    int i;
    for (i=0; i<num; ++i) 
      add(el);
  }

  public void remove(int el) {
    int i;
    for (i=0; (i<nelt)&&(elts[i]!=el);++i);
    if (i<nelt) {
      if (count[i]>1)
	count[i]--;
      else {
	for(i++; i<nelt; i++) {
	  elts[i-1]=elts[i];
	  count[i-1]=count[i];
	}
	nelt--;
      }
    }
  }
  
  public void remove_many(int el, int num) {
    int i;
    for (i=0; i<num; ++i)
      remove(el);
    }
  
  public int size() {
    int sz = 0;
    int i;
    for (i = 0; i<nelt; ++i)
      sz = sz + count[i];
    return sz;
  }

  public int number(int el) {
    if (!super.has(el)) return 0;
    else {
      int i;
      for (i=0; elts[i]!=el; ++i);
      return count[i];
    }
  }
  
  public boolean equal(BBag b) {
    if (nelt!=b.nelt) return false;
    if (size()!=b.size()) return false;
    if (nelt==0) return true;
    int i;
    int j;
    for (i=0,j=0; (i<nelt)&&(j<nelt); i++) {
      for (j=0; (j<nelt)&&(elts[i] != b.elts[j]); j++);
      if ((j==nelt)||(count[j]!=b.count[j])) return false;
    }
    return true;
  }
  
  public void print() {
    int i;
    System.out.print("{");
    for (i=0; i<nelt; ++i) {
      int j;
      for (j=0; j<count[i]; ++j)
	System.out.print((i!=0 ? ", " : "")+elts[i]);
    }
    System.out.println("}");
  }
    
  private int count[];
}
Back