一个链表打印,但另一个非空链表不打印:修改和扩展

时间:2014-12-18 17:30:14

标签: java printing linked-list

我已经修改了这个问题。我有两个链接列表,每个对象类型一个(Vertex,Edge)。边的链表打印,但顶点的链表不会打印。如果我切换订单或将代码分成两种方法,这个问题仍然存在。

这是打印方法

public void printList() {        
    ListIterator edgeIter = m_EdgeList.listIterator();
    Edge e;
    while (edgeIter.hasNext()) {
        e = (Edge)edgeIter.next();
        System.out.println(e.getName()+e.getOrientation());
    }
    ListIterator vertexIter = m_VertexList.listIterator();
    Vertex v;
    while (vertexIter.hasNext()) {
        v = (Vertex)vertexIter.next();
        System.out.println(v.getName()+":"+v.getIncidentEdge(1).getName()+ v.getIncidentEdge(1).getOrientation()+v.getIncidentEdge(2).getName()+ v.getIncidentEdge(2).getOrientation());
    }
}

链表不是空的。当我创建它时,我打印尺寸,看它增加。此外,当我打印原始列表,然后打印一个大小的前面打印时,我得到:

[com.expertdecision.topology.classification.structure.Vertex@de6ced,com.expertdecision.topology.classification.structure.Vertex @ c17164,com.expertdecision.topology.classification.structure.Vertex@1fb8ee3] 曲面:f1:由3个顶点组成

似乎顶点迭代器没有按预期工作,但我使用它与使用边缘迭代器的方式相同。

以下是从边数组创建边的链接列表的方法:

 public void setEdgeList(Edge[] edges) {
     String method = "setEdges(Edge[])";
     if (m_Tracing) Tracing.print(m_Class + "::" + method);
      m_EdgeList = new LinkedList<Edge>();
      ListIterator iter = m_EdgeList.listIterator();
      for (int i=0; i<m_EdgeCount; i++) {
            iter.add(edges[i]);
      }
  }

以下是为顶点创建链表的方法:

 /**
 * Create vertices for every pair of edges
 */
public void createVertices() {
    String method = "createVertices()";
    if (m_Tracing) Tracing.print(m_Class + "::" + method);
    int iVertex;
    String[] vlabel = {"A","B","C","D","E","F","G"};
    //This implementation uses a LinkedList
    m_VertexList = new LinkedList<Surface>();   
    ListIterator eIter = m_EdgeList.listIterator();
    Vertex v;
    Edge e1;
    Edge e2;
    //
    iVertex = 0;    
    e1 = (Edge)eIter.next();        
   while (eIter.hasNext()) {
        e2 = (Edge)eIter.next();            
        v = new Vertex(vlabel[iVertex],e1, e2);
        if (m_Debugging) System.out.println("Adding " + v.getName()+ " to vertex list");
        m_VertexList.add(v);
        if (m_Debugging) System.out.println("Current size of vertex list is " +m_VertexList.size());
        iVertex++;
        e1 = e2;
    }
    //Vertex for the last-first edge    
    e2 = (Edge)m_EdgeList.get(0);
    v = new Vertex(vlabel[iVertex],e1, e2);
    if (m_Debugging) System.out.println("Adding " + v.getName()+ " to vertex list");
    m_VertexList.add(v);
    if (m_Debugging) System.out.println("Current size of vertex list is " +m_VertexList.size());
    if (m_Debugging) printList();
}

2 个答案:

答案 0 :(得分:1)

使用调试器(如在Eclipse中)或设置一些System.out行来验证,但似乎arraylist是空的并且没有进入while循环。

答案 1 :(得分:0)

第一点是你希望得到的答案,但如果不是这样的话,其他部分也很有意思(抱歉不在评论中提问)。

  1. 您使用常量2获得第二个点,但可能只有01。数组是从Java中的0索引的。
  2. 你有异常吗? (你关于更改顺序的评论不会影响结果表明不是,只是想确定。)[捕捉异常而不至少打印出栈跟踪是非常糟糕的习惯。]
  3. 如果对第一个问题的答案是肯定的......边缘是null
  4. 的可能性
  5. (为什么使用原始类型?)
  6. (你为什么需要ListIterators?)
  7. 您能分享Vertex#getIncidentEdge(1)的实施吗?
  8. 所以我会用这样的东西:

       System.out.println(v.getName()+":"+v.getIncidentEdge(0).getName()+ v.getIncidentEdge(0).getOrientation()+v.getIncidentEdge(1).getName()+ v.getIncidentEdge(1).getOrientation());
    

    @Ascalonian的答案是一个有用的建议。这样,您可以在将断点设置为Exception时看到问题。之后,您只需检查堆栈即可查看问题。