Bag remove()方法

时间:2018-05-06 21:38:30

标签: java algorithm data-structures linked-list bag

我得到了像这样的Bag类

    import java.util.Iterator;
    import java.util.NoSuchElementException;

    public class Bag<Item> implements Iterable<Item> {

    private int N;               // number of elements in bag
    private Node<Item> first;    // beginning of bag

    // helper linked list class
    private class Node<Item> {
    private Item item;
    private Node<Item> next;
    }

    /**
    * Initializes an empty bag.
     */
    public Bag() {
    first = null;
    N = 0;
    }

    /**
     * Is this bag empty?
    * @return true if this bag is empty; false otherwise
     */
    public boolean isEmpty() {
    return first == null;
    }

    /**
     * Returns the number of items in this bag.
     * @return the number of items in this bag
     */
    public int size() {
    return N;
    }

    /**
     * Adds the item to this bag.
     * @param item the item to add to this bag
     */
    public void add(Item item) {
    Node<Item> oldfirst = first;
    first = new Node<Item>();
    first.item = item;
    first.next = oldfirst;
    n++;
}

    public void remove(Item item){ 
    // currentNode is the reference to the first node in the list and to the Item
    Node<Item> currentNode = first; 
    // if items equals the first node in the list, then first = currentNode.next which will make the first item 
    Node<Item> temp = currentNode;
    while(temp.next != null){
        temp = currentNode;
        if(item.equals(currentNode.item)){
            currentNode = currentNode.next;
            temp.next = currentNode;
            break;
        }else{
            currentNode = currentNode.next;
        }
    }
    N--; 
}

/**
 * Returns an iterator that iterates over the items in the bag in arbitrary order.
 * @return an iterator that iterates over the items in the bag in arbitrary order
 */
public ListIterator<Item> iterator()  {
    return new ListIterator<Item>(first);  
}

// an iterator, doesn't implement remove() since it's optional
private class ListIterator<Item> implements Iterator<Item> {
    private Node<Item> current;

    public ListIterator(Node<Item> first) {
        current = first;
    }

    public boolean hasNext()  { return current != null;                     }
    public void remove()      { throw new UnsupportedOperationException();  }

    public Item next() {
        if (!hasNext()) throw new NoSuchElementException();
        Item item = current.item;
        current = current.next; 
        return item;
    }
}

可以看出,remove()方法是可选的,因此它不包括算法。

我写了这样的删除方法:

public void remove(Item item)      { 
        Node<Item> currentNode = (Node<Item>) first;
        Node<Item> previousNode = null;
        while(currentNode != null){
            if(item.equals(currentNode.item)){
                if(previousNode  == null) {
                  first = (Node<Item>) currentNode.next;
                }
                else {
                  previousNode.next = currentNode.next;
                }
                n--;
            }
            else {
              previousNode = currentNode;
            }
            currentNode = currentNode.next;
        }

    }

然而,

first = (Node<Item>) currentNode.next;

此行显示“类型不匹配:无法从Bag.Node转换为Bag.Node”错误,这让我感到困惑。

如何克服此错误或我的删除方法中是否缺少某个部分?

2 个答案:

答案 0 :(得分:2)

public class Bag<Item> implements Iterable<Item> {
  // ...
  private class Node<Item> {
    // ...
  }
  // ...
}

这是定义两个不同的类型变量,名称为Item

如果您希望Node的实例使用与Bag的包含实例相同的类型变量,请移除<Item>上的Node

private class Node {

答案 1 :(得分:0)

我以这种方式克服了这个问题。

n

如果要测试...

   public void removeAllOccurences(Item item){ 

   Node<Item> currentNode = first;

   Bag<Item> b = new Bag<Item>();
   Bag<Item> reverseB = new Bag<Item>();

   Node<Item> previous = new Node<Item>();

        if(item.equals(first.item)){

                first = currentNode.next;
                N--;
                currentNode = currentNode.next;
                }

            previous.item = currentNode.item;

            b.add(previous.item);

            currentNode = currentNode.next;

            while(currentNode != null){

                if(item.equals(currentNode.item))
                {
                    previous.item = previous.item;
                        N--;

                } else{

                        previous.item = currentNode.item;
                        b.add(previous.item);

                }


                currentNode = currentNode.next;


            }

            for(Item i: b)
                reverseB.add(i);

        this.first = reverseB.first;

}

输出删除所有出现的2:

public static void main(String[] args) {

    Bag<Integer> b = new Bag<Integer>();
    Random rm = new Random();

    for(int i =0; i < 10; i++)
        b.add(rm.nextInt(3));

    System.out.println("Bag before removing op: ");
    for(Integer i: b)
        System.out.print(" "+ i);

    System.out.println("\nBag size BEFORE: "+b.size());

    b.removeAllOccurences(2);

    System.out.println("\nBag after removing op: ");
    for(Integer i: b)
        System.out.print(" "+ i);
    System.out.println("\nBag size AFTER: "+b.size());

}