2
class Node<E> {
     private E data;
     private Node<E> next;
     Node(E data, Node<E> next) {
         this.data = data;
         this.next = next;
     }
     // .. getter-setters
}

为了统计创建了 Node 类的对象数量,我们可以在类中添加一个静态属性,并在创建新对象时递增它。

如何保持为每种类型创建的节点实例的计数?(例如,6 个节点实例是整数类型,4 个节点是浮点类型等)。

一种天真的方法可以是为每种类型添加静态变量(例如 IntCount、FloatCount),并根据传递给构造函数的数据实例对其进行递增。

class Node<E> {
    private E data;
    private Node<E> next;
    private static int GlobalCount;
    private static int IntCount, FloatCount;

    static {
        GlobalCount = IntCount = FloatCount = 0;
    }

    Node(E data, Node<E> next) {
        this.data = data;
        this.next = next;
        GlobalCount++;

        if(data instanceof Integer) 
            IntCount++;
        else if (data instanceof Float) 
            FloatCount++;
    }
}

目前这将只跟踪整数和浮点数的计数。如果要跟踪的类型数量增加,上述修改将不是一个好的解决方案。

我想知道是否有更好的方法来实现这一点。

4

2 回答 2

4

你可以有以下HashMap

static HashMap<Class, Integer> refCount = new HashMap<Class, Integer>();

Node(E data, Node<E> next) 
{
    this.data = data;
    this.next = next;
    GlobalCount++;

    Class type = data.getClass();

    Integer countObj = refCount.get(type);
    int count = 1;
    if(countObj != null)
    {
        count = countObj.intValue();
        count++;
    }
    refCount.put(type, count); 
}
于 2012-12-21T05:57:33.930 回答
0

不要使计数器“静态”。

我的数据结构类...

public class LinkedList<T> {

private GenericNode<T> head;
private int size;    //Don't make this 'static'

public LinkedList(){
    this.head = null;
    size = 0;
}

public int size(){
    return size;
}

我的应用类...

private static LinkedList<Flight> scheduledFlights;
private static LinkedList<Passenger> outboundPassengers;

public static void main(String[] args) {

    scheduledFlights = new LinkedList<Flight>();
    outboundPassengers = new LinkedList<Passenger>();



    scheduledFlights.add(new Flight("EI123", "Aer Lingus", "CDG"));
    scheduledFlights.add(new Flight("EI223", "Aer Lingus", "STN"));

    outboundPassengers.add(new Passenger("John", "LHR", "London"));
    outboundPassengers.add(new Passenger("Paul", "LHR", "London"));
    outboundPassengers.add(new Passenger("George", "LHR", "London"));
    outboundPassengers.add(new Passenger("Ringo", "LHR", "London"));

    System.out.println(scheduledFlights.size());
    System.out.println(outboundPassengers.size());

控制台输出...

2
4

显示计数器特定于 LinkedList 的实例。

为什么...我很欣赏对于普通对象类中的计数器,您将使用静态计数器。“静态”计数器通常会在对象的所有实例中引用,因此所有增量或减量都会影响同一个计数器。

当您实例化任何类型的泛型类时,“静态”变量与 的实例相关联GenericsClass,而不是GenericsClass<anytype>. 因此,在我的情况下,astatic int size将是所有 LinkedList 实例中的通用 int 变量,无论它是LinkedList<Flight>还是LinkedList<Passenger>

因此,在使用基于泛型的数据结构时,使用常规实例变量作为计数器是正确的。

希望这可以帮助。

约翰

于 2015-04-21T14:12:34.053 回答