2015-04-03 27 views
0

目前我正在尝试编写一个程序来创建一个MinHeap,尽管我似乎无法让ArrayList正常工作,因为其中一个类似乎无法与另一个类连接。当一个类试图将元素添加到ArrayList时,会出现问题。课程由----Java类和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) 
+3

错误是来自插入方法的pq未定义。虽然我不知道如何解决这个问题。看来插入方法不能访问创建的ArrayList?请帮忙。 – Colour 2015-04-03 17:25:41

+0

@Prashant然后没有这样的方法!准确的意思是什么?无论如何要让它像那样工作? – Colour 2015-04-03 17:29:56

+0

@Prashant ['ArrayList#add(int,E)'](https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#add-int-E-)exists 。这是将元素放在一个特定的索引 – 2015-04-03 17:33:42

回答

4

声明ArrayList作为一个字段变量,而不是一个局部变量的构造器:

class MiniHeap { 
    private ArrayList<Integer> pq; 

    public MiniHeap(int maxElements) { 
     pq = new ArrayList<>(maxElements); 
    } 

    //your methods.. 
} 

请记住,对于ArrayList构造函数的参数是不是最大尺寸;它的初始尺寸。列表没有最大尺寸。


Element#data的类型是Object。由于您ArrayList只接受Integer,你得到的错误,因此:

Object cannot be converted to 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()); 
    } 
} 

只需简单地声明ElementMiniHeap与同类型的参数:

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。取决于你的情况,自动拆箱仍然是一个问题。

+0

它应该使用这个工作吗? :)。 – Colour 2015-04-03 17:55:59

+0

@Courour你为什么不尝试呢?你的代码的问题是你只在构造函数可以访问的范围内声明'ArrayList'。你需要在字段中声明它,所以所有的方法都可以访问它 – 2015-04-03 17:57:12

+0

我试过了,但现在它返回错误:PQHeap.java:19:error: 找不到适合的方法add(int,Obje p.add(e.key,e.data); //e.key = i,e.data = 0 ^ 方法List.add(int,Integer)不适用 (参数不匹配;对象无法转换整数) 方法AbstractList.add(int,Integer)不适用 (参数不匹配;对象不能转换为整数) 方法ArrayList.add(int,Integer)不适用 (参数不匹配;对象无法转换到整数) – Colour 2015-04-03 19:44:00