我知道在stackoverflow中已经有很多问题,但我找不到能解决问题的答案。
在下面的代码中,我无法打印ArrayList<Integer>
中的每个项目,因为它表示"Edge cannot be cast to java.lang.Integer"
。
我尝试使用for(Integer item :p1)
和for (int item: p1)
打印每个项目,但两者都不起作用。
我想问题可能是因为Edge类中的toString()
方法,但是如果我不使用toString()
我就无法获得真正的密钥编号(它将打印为Edge@28a418fc
或类似的东西)
感谢您的帮助
主要课程
public class Ranker7 {
static Graph g;
static Node n;
static Edge e;
static HashMap<Integer, Node> nodeMap;
int id;
static double weight;
static int year;
static int type;
Ranker7() {
g = new Graph();
nodeMap = new HashMap<Integer, Node>();
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<Integer> p1 = new ArrayList<Integer>();
/**Get the papers written by input author A-P**/
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<Integer> nodeIDs;
public HashMap<Integer, String> nodeIDsWithTN;
public HashMap<Integer, String> TNMap;
private HashMap<Integer, ArrayList<Integer>> edges;
private HashMap<Integer, ArrayList<Integer>> reverse;
private int numNodes;
private int numEdges;
private int numReverse;
public Graph() {
edges = new HashMap<Integer, ArrayList<Integer>>();
reverse = new HashMap<Integer, ArrayList<Integer>>();
nodeIDs = new HashSet<Integer>();
nodeIDsWithTN = new HashMap<Integer, String>();
TNMap = new HashMap<Integer, String>();
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<String> getInEdgesFromPtoA(String id) {
if (!reverse.containsKey(id)) return null;
ArrayList<String> a = reverse.get(id);
ArrayList<String> result = new ArrayList<String>();
for(int j=0;j<a.size();j++){
if(a.get(j).startsWith("A")){
result.add(a.get(j));
}
}
return result;
}
**/
public ArrayList<Integer> getOutEdges(Integer key) {
if (!edges.containsKey(key))
return null;
ArrayList<Integer> value = edges.get(key);
return value;
}
public ArrayList<Integer> getOutEdgesToP(int id) {
if (!edges.containsKey(id)) {
return null;
}
ArrayList<Integer> 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<Integer> 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;
}
}
答案 0 :(得分:5)
private HashMap<Integer, ArrayList<Integer>> edges;
// ...later
Edge e = new Edge(from,to,T);
// ...later
else {
tmp = new ArrayList();
edges.put(e.from,tmp);
}
tmp.add(e);
最终,这是why raw types are bad的典型例子。您已获得ArrayList<Integer>
并且已将Edge
放入其中。
不幸的是,我不知道该怎么告诉你如何修复它,因为我不明白你想要做什么。
答案 1 :(得分:5)
错误就在这里
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<Integer>();
在向其添加Edge时会出现编译错误
答案 2 :(得分:1)
你声明:
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
- 尽管不是真的需要,也不要混用它们。
答案 3 :(得分:1)
public ArrayList<Integer> getOutEdgesToP(int id) {
if (!edges.containsKey(id)) {
return null;
}
System.out.println(edges.get(id));
ArrayList<Integer> 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;
}
这应该有效。我没有太多时间寻找解释。