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