java - ClassCastException : cant be cast to java. lang.Integer

标签 java

我知道这个问题在 stackoverflow 中被问了很多,但我找不到适合我的问题的答案。

在下面的代码中,我无法打印 ArrayList<Integer> 中的每一项因为它说"Edge cannot be cast to java.lang.Integer"

我尝试使用 for(Integer item :p1) 打印每个项目还有for (int item: p1)但两者都不起作用。

我认为问题可能是因为 toString() Edge 类中的方法,但如果我不使用 toString()我无法获得真正的 key 号码(它将被打印为 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;
      }
}

最佳答案

private HashMap<Integer, <strong>ArrayList<Integer></strong>>  edges;

// ...later

Edge e = new Edge(from,to,T);

// ...later

else {
    tmp = new ArrayList();
    edges.put(e.from,<strong>tmp</strong>);
}
<strong>tmp.add(e);</strong>

最终,这是 why raw types are bad 的经典示例。你有一个 ArrayList<Integer>然后你输入 Edge就在里面。

不幸的是,我不知道如何告诉你如何解决它,因为我不明白你想要做什么。

关于java - ClassCastException : cant be cast to java. lang.Integer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29666610/

相关文章:

java - 如何为 SBT 设置 Java 版本

Java - 根据请求关闭并发线程

java - 从 jar-with-dependencies 构建的 jar 中排除文件

java - MongoDB:有没有办法在同一操作中查找文档并在其中设置值?

java - 在 IntelliJ IDEA 中突出显示异常抛出者

java - 打印图形顶点和边缘源/目标 - JGraphT

java - 如何只打印某些字母

java - 为什么我不能自动连接 AuthorizationServerTokenServices 或 ConsumerTokenServices? "There is more than one bean of [this] type"

java - 我如何使用 Spring Boot 发送帖子请求并从主页操作它们?

java - 如何使JFrame内JPanel内JLabel内的BufferedImage正确刷新?