2013-03-27 3 views
0

в этом коде, когда я хочу добавить ребро между двумя узлами для прохода или для отказа, я могу сделать это легко. но есть проблема в валидации, и если мы снова создадим ребро между теми же двумя созданными его узлами. Это то, чего я не хочу. Мне нужен только один ребро, созданное между одними и теми же узлами с помощью частного класса ConnectAction. я пробовал что-то там, но его не работает. Если мы удалим итератор и просто создадим его, он получит created.please help.единый край требуется между двумя узлами графа

здесь класс узел

private static class Node { 
private Point p; 
private int r; 
private String NAME; 
private String nodeid; 
private boolean selected = false; 
private Rectangle b = new Rectangle(); 

/** 
* Construct a new node. 
*/ 
public Node(String nodeid,Point p, int r,String NAME) { 
    this.nodeid=nodeid; 
    this.p = p; 
    this.r = r; 
    this.NAME = NAME; 

    setBoundary(b); 

} 

/** 
* Calculate this node's rectangular boundary. 
*/ 
private void setBoundary(Rectangle b) { 
    b.setBounds(p.x - r, p.y - r, 2 * r, 2 * r); 
} 

/** 
* Draw this node. 
*/ 
public void draw(Graphics g) { 
    g.setColor(Color.white); 

      g.fillRect(b.x, b.y, b.width, b.height); 
      g.setColor(Color.black); 
      g.drawString(NAME,b.x+25,b.y+40); 

    if (selected) { 
     g.setColor(Color.darkGray); 
     g.drawRect(b.x+3, b.y+3, b.width, b.height); 
    } 
} 

/** 
* Return this node's location. 
*/ 
public Point getLocation() { 
    return p; 
} 

/** 
* Return true if this node contains p. 
*/ 
public boolean contains(Point p) { 
    return b.contains(p); 
} 

/** 
* Return true if this node is selected. 
*/ 
public boolean isSelected() { 

    return (selected); 

} 

/** 
* Mark this node as selected. 
*/ 
public void setSelected(boolean selected) { 
    this.selected = selected; 
} 

/** 
* Collected all the selected nodes in list. 
*/ 
public static void getSelected(List<Node> list, List<Node> selected) { 
    selected.clear(); 
    for (Node n : list) { 
     if (n.isSelected()) { 
      selected.add(n); 
     } 
    } 
} 

/** 
* Select no nodes. 
*/ 
public static void selectNone(List<Node> list) { 
    for (Node n : list) { 
     n.setSelected(false); 
    } 
} 

/** 
* Select a single node; return true if not already selected. 
*/ 
public static boolean selectOne(List<Node> list, Point p) { 
    for (Node n : list) { 
     if (n.contains(p)) { 
      if (!n.isSelected()) { 
       Node.selectNone(list); 
       n.setSelected(true); 
      } 
      return true; 
     } 
    } 
    return false; 
} 

/** 
* Select each node in r. 
*/ 
public static void selectRect(List<Node> list, Rectangle r) { 
    for (Node n : list) { 
     n.setSelected(r.contains(n.p)); 

    } 
} 

/** 
* Toggle selected state of each node containing p. 
*/ 
public static void selectToggle(List<Node> list, Point p) { 
    for (Node n : list) { 
     if (n.contains(p)) { 
      n.setSelected(!n.isSelected()); 
     } 
    } 
} 

/** 
* Update each node's position by d (delta). 
*/ 
public static void updatePosition(List<Node> list, Point d) { 
    for (Node n : list) { 
     if (n.isSelected()) { 
      n.p.x += d.x; 
      n.p.y += d.y; 
      n.setBoundary(n.b); 

     } 
    } 
} 

}

Вот класс края

private static class Edge{ 

private Node n1; 
private Node n2; 
private String Ctype; 
private String eid; 

private static String edgeid; 

public Edge(String eid,Node n1, Node n2, String Ctype) { 
    this.eid = eid; 
    this.n1 = n1; 
    this.n2 = n2; 
    this.Ctype=Ctype; 


} 

public void draw(Graphics g) { 
    Point p1 = n1.getLocation(); 
    Point p2 = n2.getLocation(); 
    g.setColor(Color.darkGray); 
    g.drawLine(p1.x, p1.y, p2.x, p2.y); 
    g.drawString(Ctype,(p1.x+p2.x)/2,(p1.y+p2.y)/2); 
}   

}

и перед проблемой здесь, чтобы создать только одно ребро между одной парой узлов.

private class ConnectAction extends AbstractAction { 

String ConnectionType;

public ConnectAction(String name) { 
    super(name); 
    this.ConnectionType=name; 
} 

public void actionPerformed(ActionEvent e) { 
    Node.getSelected(nodes, selected); 
    if (selected.size() > 1) { 
     for (int i = 0; i < 1; ++i) { 
      Node n3 = selected.get(i); 
      Node n4 = selected.get(i + 1); 
      String a= n3.nodeid; 
      String b= n4.nodeid; 
      // System.out.println(a); 
      //System.out.println(b); 

      //System.out.println(Edgeid); 


      ListIterator<Edge> iter = edges.listIterator(); 
      while (iter.hasNext()) { 
       Edge e1 = iter.next(); 
       if (!(n3.nodeid == e1.n1.nodeid && n4.nodeid == e1.n2.nodeid) || (n4.nodeid == e1.n1.nodeid && n3.nodeid == e1.n2.nodeid)) { 
        String Edgeid=ID.giveid(); 
        Edge ed=new Edge(Edgeid,n3, n4,ConnectionType); 
        edges.add(ed); 

       }iter.remove(); 

      }                                                                   }                
    }  
    repaint(); 
} 

ответ

0

Может быть, я не понял, что вы хотите (или код), но это

ListIterator<Edge> iter = edges.listIterator(); 
while (iter.hasNext()) { 
    Edge e1 = iter.next(); 
    if (!(n3.nodeid == e1.n1.nodeid && n4.nodeid == e1.n2.nodeid) || (n4.nodeid == e1.n1.nodeid && n3.nodeid == e1.n2.nodeid)) { 
     String Edgeid=ID.giveid(); 
     Edge ed=new Edge(Edgeid,n3, n4,ConnectionType); 
     edges.add(ed); 
    } 
    iter.remove(); 
}    

создает и удаляет множество ребер. (И у Вас есть ошибка в состояние, (применяется только к первой части)

Я thinkg вы должны иметь что-то вроде этого:

boolean exists = false; 
ListIterator<Edge> iter = edges.listIterator(); 

while (iter.hasNext()) { 
    Edge e1 = iter.next(); 
    if ((n3.nodeid.equals(e1.n1.nodeid) && n4.nodeid.equals(e1.n2.nodeid)) || (n4.nodeid.equals(e1.n1.nodeid) && n3.nodeid.equals(e1.n2.nodeid))) { 
     exists = true; 

    } 
} 

if (!exists) { 
    String Edgeid=ID.giveid(); 
    Edge ed=new Edge(Edgeid,n3, n4,ConnectionType); 
    edges.add(ed); 
} 

Кроме того, вы должны обычно использовать String.equals (String) для сравнения строк.

Смежные вопросы