Test<Double>类调用size()方法提示未定义,如何正确实现该方法?
问题原因
你自定义的Test类是手写的链表结构,类内部没有定义size()成员方法,所以调用numbers.size()时编译器找不到对应方法才会抛出该错误。
size()方法实现方案
有两种实现方式可选:
方式1:维护计数器变量(推荐,性能更高)
- 给
Test类新增一个int类型的私有成员变量n,用来记录当前链表存储的元素个数 - 在
add()方法每成功添加一个元素时,将n自增1 - 新增
size()方法直接返回n的值
修改后的完整代码如下:
public class Test<Item> implements Iterable<Item> { private Node first; // 链表首节点 private int n = 0; // 新增元素计数器 private class Node { Item item; Node next; } public void add(Item item) { Node oldfirst = first; first = new Node(); first.item = item; first.next = oldfirst; n++; // 添加元素后计数器自增 } // 新增size方法 public int size() { return n; } public Iterator<Item> iterator() { return new ListIterator(); } private class ListIterator implements Iterator<Item> { private Node current = first; public boolean hasNext() { return current != null; } public void remove() { } public Item next() { Item item = current.item; current = current.next; return item; } } }
方式2:遍历链表统计个数(不推荐)
如果不想额外维护计数器,也可以每次调用size时遍历整个链表统计节点数,时间复杂度为O(n),仅适合数据量小的场景:
public int size() { int count = 0; Node cur = first; while(cur != null) { count++; cur = cur.next; } return count; }
是否必须定义size方法?
只要你需要获取当前Test实例存储的元素个数,就必须自己实现这个方法,JDK不会给自定义类自动生成size逻辑。如果你没有获取元素总数的需求,也可以不用实现,比如你只是要遍历所有元素的话,直接用已经实现好的Iterable迭代器遍历即可,不需要调用size方法,示例如下:
Test<Double> numbers = new Test<>(); // 省略控制台输入调用add添加元素的逻辑 for(Double d : numbers) { System.out.println(d); }
内容的提问来源于stack exchange,提问作者Firefox
相关产品推荐
相关产品推荐

