2015-04-03 26 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