Java类和ArrayList

时间:2015-04-03 17:23:59

标签: java arraylist

目前我正在尝试编写一个程序来制作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)

1 个答案:

答案 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());
   }
}

只需使用相同的类型参数声明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。但是,根据您的具体情况,自动拆箱仍然是一个问题。