目前我正在尝试编写一个程序来制作MinHeap,虽然我似乎无法让ArrayList正常工作,因为其中一个类似乎没有与另一个类连接。当一个类尝试将元素添加到ArrayList时,会发生此问题。类由----
分隔public interface QUEUE {
public Element getMin();
public void add(Element e);
}
public class Element {
public int key;
public Object data;
public Element(int i, Object o){
this.key = i;
this.data = o;
}
}
class TestProject {
public static void main(String[] args) {
System.out.println();
QUEUE q = new QUEUEHeap(10);
System.out.println(" 5, 1, 2, 33, -1, 3, 1, 2, 23, 13");
System.out.println();
q.insert(new Element(5,new Integer(5)));
q.insert(new Element(1,new Integer(1)));
q.insert(new Element(2,new Integer(2)));
}
import java.util.ArrayList;
public class QUEUEHeap implements QUEUE {
private ArrayList<Integer> q;
public PQHeap(int maxElements) {
q = new ArrayList<>(maxElements);
System.out.println("Element at index 1: " + q);
}
public Element getMin() {
}
public void insert(Element e) {
q.add(e.key,e.data); //e.key = i, e.data = o
}
}
新错误:
no suitable method found for add(int,Obje
q.add(e.key,e.data); //e.key = i, e.data = o
^
method List.add(int,Integer) is not applicable
(argument mismatch; Object cannot be converted to Integer)
method AbstractList.add(int,Integer) is not applicable
(argument mismatch; Object cannot be converted to Integer)
method ArrayList.add(int,Integer) is not applicable
(argument mismatch; Object cannot be converted to Integer)
答案 0 :(得分:4)
将ArrayList
声明为字段变量,而不是构造函数的局部变量:
class MiniHeap {
private ArrayList<Integer> pq;
public MiniHeap(int maxElements) {
pq = new ArrayList<>(maxElements);
}
//your methods..
}
请记住ArrayList
的构造函数参数不是最大值;它的初始大小。列表没有最大尺寸。
Element#data
的类型为Object
。由于您的ArrayList
只接受Integer
,因此您收到了错误,因此:
对象无法转换为整数
Element#data
应该是堆类中ArrayList
的类型。为了允许多种类型,我个人给Element
一个类型参数:
class Element<T> {
private int key;
private T data;
public Element(int key, T data) {
this.key = key;
this.data = data;
}
public T getData() {
return data;
}
public int getKey() {
return key;
}
}
然后创建一个允许特定类型数据的堆(将列表分配给该类型):
class MiniHeap<T> {
private ArrayList<T> pq;
public MiniHeap(int initialAmount) {
pq = new ArrayList<>(initialAmount);
}
public void insert(Element<T> element) {
pq.add(element.getKey(), element.getData());
}
}
只需使用相同的类型参数声明Element
和MiniHeap
:
public class Main {
public static void main(String[] args) {
Element<Integer> element = new Element<>(0, 10);
MiniHeap<Integer> heap = new MiniHeap<>(20);
heap.insert(element);
}
}
谨防auto-boxing。原始类型不能用于泛型类型参数,因此使用primitive wrapper classes代替,它将原始值包装在对象中。当uoi声明new Element<>(0, 10)
时,10
被装入一个对象,因为构造函数的参数是(int, Integer)
而不是(int, int)
。要防止自动装箱,请使用new Integer(10)
而不是10
。但是,根据您的具体情况,自动拆箱仍然是一个问题。