0

合格または不合格のために 2 つのノード間にエッジを追加したい場合、簡単に行うことができますが、検証に問題があり、同じ 2 つのノード間にエッジを再度作成すると、それが作成されます。これは望ましくありません。プライベート クラス ConnectAction によって同じ 2 つのノード間に作成されたエッジが 1 つだけ必要です。そこで何かを試しましたが、うまくいきません。イテレータを削除して、作成されるエッジを作成するだけです。

ここにノードクラスがあります

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);
    }        
}

ここで問題に直面して、同じノードのペア間にエッジを1つだけ作成します。

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();
    }
}
4

1 に答える 1

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();
}            

多くのエッジを作成および削除します。(そして、条件にエラーがあります (! は最初の部分にのみ適用されます)

私はあなたがこのようなものを持っているべきだと思います:

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) を使用して文字列を比較する必要があります。

于 2013-03-27T18:54:44.240 に答える