java - 无法访问 GraphNode 内的对象

标签 java

我有一个包含 GraphNodes 类型对象的图表。这些节点包含一个对象 City,该对象具有是否被感染的属性。我想遍历所有节点并检查一个城市是否被感染。我有一个通用方法 getInfo,在我的例子 City 中,它返回一个 E 类型的对象。但是,当我尝试链接另一个方法或获取属性时,我看不到它们,就好像它们不可用一样。代码中的所有类(class)都来自大学,因此我无法添加/删除方法。我尝试过 foreach 但仍然无法获取方法。

代码:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.LinkedList;

class City {

    String osnovna_granka;
    boolean zarazen;

    City(String osnovna_granka, boolean zarazen) {
        this.osnovna_granka = osnovna_granka;
        this.zarazen = zarazen;
    }

    @Override
    public String toString() {
        if (zarazen == true) {
            return osnovna_granka + " zarazen";
        } else {
            return osnovna_granka + " nezarazen";
        }
    }
}

class Graph {

    int num_nodes;
    GraphNode<City> adjList[];


    @SuppressWarnings("unchecked")
    public Graph(int num_nodes) {
        this.num_nodes = num_nodes;
        adjList = (GraphNode<City>[]) new GraphNode[num_nodes];
    }

    int adjacent(int x, int y) {
        // proveruva dali ima vrska od jazelot so
        // indeks x do jazelot so indeks y
        return (adjList[x].containsNeighbor(adjList[y])) ? 1 : 0;
    }

    void addEdge(int x, int y) {
        // dodava vrska od jazelot so indeks x do jazelot so indeks y
        if (!adjList[x].containsNeighbor(adjList[y])) {
            adjList[x].addNeighbor(adjList[y]);
        }
    }

    void deleteEdge(int x, int y) {
        adjList[x].removeNeighbor(adjList[y]);
    }

    @Override
    public String toString() {
        String ret = new String();
        for (int i = 0; i < this.num_nodes; i++) {
            ret += i + ": " + adjList[i] + "\n";
        }
        return ret;
    }
}

class GraphNode<E> {

    private int index;//index (reden broj) na temeto vo grafot
    private E info;
    private LinkedList<GraphNode<E>> neighbors;

    public GraphNode(int index, E info) {
        this.index = index;
        this.info = info;
        neighbors = new LinkedList<GraphNode<E>>();
    }

    boolean containsNeighbor(GraphNode<E> o) {
        return neighbors.contains(o);
    }

    void addNeighbor(GraphNode<E> o) {
        neighbors.add(o);
    }

    void removeNeighbor(GraphNode<E> o) {
        if (neighbors.contains(o)) {
            neighbors.remove(o);
        }
    }

    @Override
    public String toString() {
        String ret = "INFO:" + info + " SOSEDI:";
        for (int i = 0; i < neighbors.size(); i++) {
            ret += neighbors.get(i).info + " ";
        }
        return ret;

    }

    @Override
    public boolean equals(Object obj) {
        @SuppressWarnings("unchecked")
        GraphNode<E> pom = (GraphNode<E>) obj;
        return (pom.info.equals(this.info));
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    public E getInfo() {
        return info;
    }

    public void setInfo(E info) {
        this.info = info;
    }

    public LinkedList<GraphNode<E>> getNeighbors() {
        return neighbors;
    }

    public void setNeighbors(LinkedList<GraphNode<E>> neighbors) {
        this.neighbors = neighbors;
    }
}

public class Main {

    public static void main(String[] args) throws Exception {
        int i, j, k;

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        Graph g = new Graph(N);

        for (i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            st.nextToken();
            String osnovna_granka = st.nextToken();
            String str_zarazen = st.nextToken();
            if (str_zarazen.equals("zarazen")) {
                g.adjList[i] = new GraphNode(i, new City(osnovna_granka, true));
            } else {
                g.adjList[i] = new GraphNode(i, new City(osnovna_granka, false));
            }

        }

        int M = Integer.parseInt(br.readLine());
        for (i = 0; i < M; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            g.addEdge(a, b);
            g.addEdge(b, a);
        }

        br.close();
        Stack<GraphNode> stack = new Stack<>();
        int counter = 0;
        // vasiot kod ovde;
        for(GraphNode gn: g.adjList) {
            gn.getInfo().// Here the properties of City should show up
        }


    }
}

最佳答案

GraphNode 是通用类型,您尚未指定类型,IDE 无法推断类型,因此无法建议任何方法。在for循环中,您需要指定GraphNode的类型。

for(GraphNode<City> gn: g.adjList)

关于java - 无法访问 GraphNode 内的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56425136/

相关文章:

java - Scala:需要 "explicit return"吗?

java - Hibernate 对象在 AngularJS 和 Spring 中作为 @RequestBody

java - 使用公开为 @WebService 的基于 SOAP 的 @Stateless EJB 实现长轮询

java - 使用javacv中的匹配模板查找图像中特定区域的图像

java - 是否可以使用 @Spy 表示法在 Mockito 中声明但不能实例化一个 spy 对象?

使用 Pact 的 JAVA 契约(Contract)测试(CDC)

java - 无法在 Windows 10 上设置 Apache Spark 2.1.1

java - Java/Struts 中基于角色的操作授权

java - 将二维整数数组的行从小到大排序

java - 如何编译和运行包中的类,该类从另一个包中的另一个类继承 protected 成员