ClassCastException:无法转换为java.lang.Integer
我知道在stackoverflow中已经有很多问题,但我找不到能解决问题的答案。
在下面的代码中,我无法打印出ArrayList
每个项目,因为它表示"Edge cannot be cast to java.lang.Integer"
。
我试图使用for(Integer item :p1)
和for (int item: p1)
打印每个项目for(Integer item :p1)
但两者都不起作用。
我想也许问题是因为Edge类中的toString()
方法但是如果我不使用toString()
我就无法获得真正的密钥号(它将被打印为Edge@28a418fc
或类似的东西)
谢谢你以前的帮助
主要课程
public class Ranker7 { static Graph g; static Node n; static Edge e; static HashMap nodeMap; int id; static double weight; static int year; static int type; Ranker7() { g = new Graph(); nodeMap = new HashMap(); n = new Node(id,year,type,weight); } public static void main (String[] args) throws Exception{ long startTime = System.currentTimeMillis(); /**Rule Mining**/ Ranker7 Ranker = new Ranker7(); Connection connect = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; PreparedStatement preparedStatement2 = null; ResultSet resultSet2 = null; HashMap nodeMap = new HashMap(); System.out.println("Processing..."); Class.forName("com.mysql.jdbc.Driver"); connect = DriverManager.getConnection("jdbc:mysql://localhost/arnetminer?"+"user=root&password=1234"); preparedStatement = connect.prepareStatement("Select fr,t,ty from subedge"); resultSet = preparedStatement.executeQuery(); int i=0; while(resultSet.next()) { g.addEdgeForIndexing(resultSet.getInt(1),resultSet.getInt(2),resultSet.getInt(3)); i++; System.out.println( "edges added to G = "+i); } System.out.println("Loaded " + g.nodeCount() + " nodes."); preparedStatement = connect.prepareStatement("Select node,year,type from subnode2"); resultSet = preparedStatement.executeQuery(); int h=0; while(resultSet.next()) { Node n = new Node(resultSet.getInt(1), resultSet.getInt(2),resultSet.getInt(3),weight); int key1=resultSet.getInt(1); nodeMap.put(key1,n); h++; } System.out.println(nodeMap); System.out.println(nodeMap.size()); Scanner sc = new Scanner(System.in); System.out.println("How many authors do you want to enter?"); int num = sc.nextInt(); int[] authorNames = new int[num]; for(int a = 0; a < authorNames.length; a++){ System.out.println("Enter author name:"); authorNames[a] = sc.nextInt(); } System.out.println("Year : "); int inputYear3 = sc.nextInt(); ArrayList p1 = new ArrayList(); /**Get the papers written by input author AP**/ for(int b=0; b< authorNames.length;b++){ int AuthorID1 = authorNames[b]; p1 = g.getOutEdgesToP(AuthorID1); } for(int item : p1){ //the error of classcastexception is here System.out.println(item); } } }
边缘类
public class Edge { int from; int to; int type; private static int counter = 0; public Edge(int from, int to, int type) { this.from = from; this.to = to; this.type = type; // System.out.println("edges added from " + from + " to " + to + " with type "+ type); } public String toString(){ String repr = Integer.toString(to); return repr; } public int getfrom(){ return from; } public int getto(){ return to; } public int getType(){ return type; } public void setfrom(int from){ this.from = from; } public void setto(int to){ this.to = to; } public void setType(int type){ this.type = type; } }
图类
import java.lang.reflect.Field; import java.util.*; public class Graph { private HashSet nodeIDs; public HashMap nodeIDsWithTN; public HashMap TNMap; private HashMap<Integer, ArrayList> edges; private HashMap<Integer, ArrayList> reverse; private int numNodes; private int numEdges; private int numReverse; public Graph() { edges = new HashMap<Integer, ArrayList>(); reverse = new HashMap<Integer, ArrayList>(); nodeIDs = new HashSet(); nodeIDsWithTN = new HashMap(); TNMap = new HashMap(); new HashSet(); } public void addEdgeForIndexing(int from, int to, int T) throws IllegalArgumentException, IllegalAccessException { Edge e = new Edge(from,to,T); nodeIDs.add(e.from); nodeIDs.add(e.to); ArrayList tmp = null; if (edges.containsKey(e.from)) tmp = (ArrayList) edges.get(e.from); else { tmp = new ArrayList(); edges.put(e.from,tmp); } tmp.add(e); ArrayList tmp2 = null; if (reverse.containsKey(e.to)) tmp2 = (ArrayList) reverse.get(e.to); else { tmp2 = new ArrayList(); reverse.put(e.to,tmp2); } tmp2.add(e); } public int nodeCount() { if(nodeIDs.size() > 0) return nodeIDs.size(); // else return numNodes; return numEdges; } public int countInEdges(Integer key) { if (!reverse.containsKey(key)) return 0; return ((ArrayList) reverse.get(key)).size(); } public int countOutEdges(Integer key) { if (!edges.containsKey(key)) return 0; return ((ArrayList) edges.get(key)).size(); } /** public ArrayList getInEdgesFromPtoA(String id) { if (!reverse.containsKey(id)) return null; ArrayList a = reverse.get(id); ArrayList result = new ArrayList(); for(int j=0;j<a.size();j++){ if(a.get(j).startsWith("A")){ result.add(a.get(j)); } } return result; } **/ public ArrayList getOutEdges(Integer key) { if (!edges.containsKey(key)) return null; ArrayList value = edges.get(key); return value; } public ArrayList getOutEdgesToP(int id) { if (!edges.containsKey(id)) { return null; } ArrayList a = edges.get(id); System.out.println ("Arraylist a: " + a); //if i print using this its okay. but i cant get each item in this ArrayList like below for(int item : a){ //the error of classcastexception is here System.out.println(item); } return a; } public Iterator nodeIteratorInitial() { return nodeIDs.iterator(); } }
节点类
public class Node { int id; double weight; int year; int type; private static int counter = 0; public Node(int id,int year,int type,double weight) { this.id = id; this.year=year; this.weight = weight; this.type = type; } @Override public String toString() { // here you can create your own representation of the object String repr = "id:" + id + ", year:" + year + ", weight:" + weight + ", node type:" + type; return repr; } public double getWeight(){ return weight; } public int getid() { return id; } public int getType() { return type; } public int getYear() { return year; } public void setWeight(double weight){ this.weight=weight; } public void setid(int id){ this.id=id; } public void setType() { this.type=type; } }
private HashMapArrayList > edges; // ...later Edge e = new Edge(from,to,T); // ...later else { tmp = new ArrayList(); edges.put(e.from, tmp ); } tmp.add(e);
最终,这是原始类型不好的典型例子。 你有一个ArrayList
,你将Edge
放入其中。
不幸的是,我不知道如何告诉你如何解决它,因为我不明白你想要做什么。
这里的错误就在于此
public void addEdgeForIndexing(int from, int to, int T) throws IllegalArgumentException, IllegalAccessException { Edge e = new Edge(from,to,T); nodeIDs.add(e.from); nodeIDs.add(e.to); ArrayList tmp = null; if (edges.containsKey(e.from)) tmp = (ArrayList) edges.get(e.from); else { tmp = new ArrayList(); edges.put(e.from,tmp); } tmp.add(e);//adding an edge to tmp
稍后在代码中,您将ArrayList作为ArrayList从Map中获取,但是包含Edge的ArrayList会尝试更改
tmp = new ArrayList();
至
tmp = new ArrayList();
在向其添加Edge时,您应该收到编译错误
你声明:
int from; int to; int type;
你应该将它们声明为Integer
:
Integer from; Integer to; Integer type;
因为你以后做了:
this.from = new Integer(from);
等等
更好的选择是将作业更改为:
this.from = from;
这也将解决此错误,因为您将int
分配给int
。 您是否有使用new Integer()
的目的? 因为如果不是 – 我建议删除它 – 与原始int
相比,它更慢(性能方面)。
底线:保持一致,并在整个代码中使用int
,或Integer
– 尽管不是真的需要,尽量不要混合使用。
public ArrayList getOutEdgesToP(int id) { if (!edges.containsKey(id)) { return null; } System.out.println(edges.get(id)); ArrayList a = edges.get(id); System.out.println("Arraylist a: " + a); // if i print using this its // okay. but i cant get each // item in this ArrayList like // below for (Object item : a) { // the error of classcastexception is here System.out.println(item); } return a; }
这应该工作。 我没有太多时间寻找解释。