Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 图的两个节点之间需要单条边_Java_Graph - Fatal编程技术网

Java 图的两个节点之间需要单条边

Java 图的两个节点之间需要单条边,java,graph,Java,Graph,当我想在两个节点之间添加一条边以获得通过或失败时,我可以很容易地做到这一点,但验证中存在问题,如果我们再次在创建的相同两个节点之间创建一条边,我不希望这样做。我只需要通过私有类ConnectAction在相同的两个节点之间创建一条边。我在那里尝试了一些东西,但是不起作用。如果我们删除迭代器,只创建边,它就会被创建 这是节点类 private static class Node { private Point p; private int r; private Strin

当我想在两个节点之间添加一条边以获得通过或失败时,我可以很容易地做到这一点,但验证中存在问题,如果我们再次在创建的相同两个节点之间创建一条边,我不希望这样做。我只需要通过私有类ConnectAction在相同的两个节点之间创建一条边。我在那里尝试了一些东西,但是不起作用。如果我们删除迭代器,只创建边,它就会被创建

这是节点类

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 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();
    }
}
私有类ConnectAction扩展了AbstractAction{
字符串连接类型;
公共连接操作(字符串名称){
超级(姓名);
this.ConnectionType=名称;
}
已执行的公共无效操作(操作事件e){
Node.getSelected(nodes,selected);
如果(已选择.size()>1){
对于(int i=0;i<1;++i){
节点n3=已选择。获取(i);
节点n4=选中。获取(i+1);
字符串a=n3.nodeid;
字符串b=n4.nodeid;
//系统输出打印项次(a);
//系统输出打印ln(b);
//系统输出打印项次(Edgeid);
ListIterator iter=edges.ListIterator();
while(iter.hasNext()){
边e1=iter.next();
如果(!(n3.nodeid==e1.n1.nodeid&&n4.nodeid==e1.n2.nodeid)| |(n4.nodeid==e1.n1.nodeid&&n3.nodeid==e1.n2.nodeid)){
字符串Edgeid=ID.giveid();
Edge ed=新边(Edgeid、n3、n4、连接类型);
添加(ed);
}iter.remove();
}                                                                                                                                                                                                                                                                         
}                                                             
}     
重新油漆();
}
}

也许我误解了你想要什么(或你的代码),但是

ListIterator iter=edges.ListIterator();
while(iter.hasNext()){
边e1=iter.next();
如果(!(n3.nodeid==e1.n1.nodeid&&n4.nodeid==e1.n2.nodeid)| |(n4.nodeid==e1.n1.nodeid&&n3.nodeid==e1.n2.nodeid)){
字符串Edgeid=ID.giveid();
Edge ed=新边(Edgeid、n3、n4、连接类型);
添加(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);
}
boolean exists=false;
ListIterator iter=edges.ListIterator();
while(iter.hasNext()){
边e1=iter.next();
如果((n3.nodeid.equals(e1.n1.nodeid)和&n4.nodeid.equals(e1.n2.nodeid))| |(n4.nodeid.equals(e1.n1.nodeid)和&n3.nodeid.equals(e1.n2.nodeid))){
存在=真;
}
} 
如果(!存在){
字符串Edgeid=ID.giveid();
Edge ed=新边(Edgeid、n3、n4、连接类型);
添加(ed);
}
另外,您通常应该使用String.equals(String)来比较字符串

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