【问题标题】:Avoid multiple adding of content to Generics List避免向泛型列表多次添加内容
【发布时间】:2017-04-25 10:04:00
【问题描述】:

我创建自定义节点,左侧一个圆圈,右侧一个圆圈。 每次连接两个节点时,我都想将Boolean leftBoolean right 设置为true。当我将两个节点连接到一个节点时,我想将 Boolean rightleft 都设置为 true。目前我添加了多个条目而不更新我的泛型内容。

我的代码:

public static List<NodeList<Boolean,Boolean,String>> connectList = new ArrayList<NodeList<Boolean,Boolean,String>>();
private String linkedNodeID;
private Boolean right = false;
private Boolean left = false;

以及实际的代码,这里是我通过在leftTrue()/rightTrue() 中添加 always 来犯实际错误的地方:

public void leftTrue(){
    left = true;
    connectList.add(new NodeList<Boolean, Boolean, String>(left, right, linkedNodeID));
}
public void rightTrue(){
    right = true;
    connectList.add(new NodeList<Boolean, Boolean, String>(left, right, linkedNodeID));
}

我得到的是:

right connected: false ,left connected: true ,ID: 81def74e-4cb6-428c-b7ca-a57279534814
right connected: true ,left connected: false ,ID: 46514df2-da7a-41e0-bdd7-43e6f15b4220
right connected: true ,left connected: true ,ID: 46514df2-da7a-41e0-bdd7-43e6f15b4220
right connected: true ,left connected: false ,ID: 2e85f320-43cf-4d83-8670-4e917f31cd25

而我想要的是:

right connected: false ,left connected: true ,ID: 81def74e-4cb6-428c-b7ca-a57279534814
right connected: true ,left connected: true ,ID: 46514df2-da7a-41e0-bdd7-43e6f15b4220
right connected: true ,left connected: false ,ID: 2e85f320-43cf-4d83-8670-4e917f31cd25

知道如何在不向我的列表中添加另一个条目的情况下设置左/右连接吗?

编辑:

public void registerSource(String linkId, DragNode linkNode) {
    linkedNodeID = linkNode.getId();
    double nodeWidth1 = linkNode.getWidth()/2;
    if(DragNode.linkNodeOneX <= nodeWidth1){
        leftTrue();
    }else{
        rightTrue();
    }
}
public void registerTarget(String linkId, DragNode linkNode) {
    linkedNodeID = linkNode.getId();
    double nodeWidth2 = linkNode.getWidth()/2;
    if( DragNode.linkNodeTwoX < nodeWidth2){
        leftTrue();
        testprint();
    }else{
        rightTrue();
    }
}

EDIT2:

我的问题是,每当我调用leftTrue(); 时,我都会创建一个新的connectList.add(new NodeList&lt;Boolean, Boolean, String&gt;(left, right, linkedNodeID)); 条目,但如果我的列表中已经有一个ID,它应该更新leftright。有任何想法吗?比如connectList.get(i).getL();,然后如果这等于另一个Id,就设置right/false = true;

EDIT3:

public void leftTrue(){ 
    left = true;
}

public void rightTrue(){
    right = true;
}
public void registerSource(String linkId, DragNode linkNode) {
    linkedNodeID = linkNode.getId();
    double nodeWidth1 = linkNode.getWidth()/2;
    if(DragNode.linkNodeOneX <= nodeWidth1){
        leftTrue();
    }else{
        rightTrue();
    }
    if(left || right){
      connectList.add(new NodeList<Boolean, Boolean, String>(left, right, linkedNodeID));
      left = false;
      right = false;
    }
}
public void registerTarget(String linkId, DragNode linkNode) {
    linkedNodeID = linkNode.getId();
    double nodeWidth2 = linkNode.getWidth()/2;
    if( DragNode.linkNodeTwoX < nodeWidth2){
        leftTrue();
    }else{
        rightTrue();
    }
    if(left || right){
          connectList.add(new NodeList<Boolean, Boolean, String>(left, right, linkedNodeID));
          left = false;
          right = false;
    }
}

【问题讨论】:

  • 没有评论,但投反对票,谢谢。
  • 我没有看到使用 leftTruerightTrue 的代码。所以很难说到底出了什么问题。
  • 您需要更新列表中包含的 NodeList 元素,或者删除旧对象并添加一个新对象。我是否正确假设 List 中 NodeList 元素的顺序代表节点的顺序并且只能连接邻居?
  • @Lutz Horn 我首先有这个代码,但我的问题更多是在leftTrue/rightTrue 方法中,通过多次调用connectList.add(); @Sentry 现在每个节点都可以连接到任何节点, 但我稍后会解决这个问题
  • @Sentry 我尝试添加新的并删除旧的,但我不知道如何。

标签: java list generics arraylist


【解决方案1】:

我通过更新 leftTrue() 和 rightTrue() 方法使其工作:

public void leftTrue(){ 
    left = true;
    //if the function is rightTrue() then set right = true;
    if(left && right){
        String testID = self.getId();
        for(int i = 0; i < connectList.size(); i++){
            String testID2 = connectList.get(i).getL();
            if(testID == testID2){
                left = true;
                right = true;
                connectList.get(i).setT(left);
                connectList.get(i).setI(right);
            }
        }
    }else{
        connectList.add(new NodeList<Boolean, Boolean, String>(left, right, linkedNodeID));
    }
}

那么我的输出只有三个具有正确左/右的唯一 ID:

right connected: false ,left connected: true ,ID: 6036bf0c-c514-454e-abbb-c9298800a585, listsize 3
right connected: true ,left connected: true ,ID: b78abcb8-a940-44e7-9429-11006b54dc79, listsize 3
right connected: true ,left connected: false ,ID: b3188490-2183-44ee-8fc6-5af0309766a8, listsize 3

【讨论】:

    【解决方案2】:

    存储这些左值和右值,并在确定它们是左值、右值还是两者后,仅使用它们一次来创建新节点。

    if( DragNode.linkNodeTwoX < nodeWidth2){
        leftTrue();
    }else{ 
        rightTrue(); 
    }
    if(left || right){
      connectList.add(new NodeList<Boolean, Boolean, String>(left, right, linkedNodeID));
      left = false;
      right = false;
    }
    
    
    public void leftTrue(){ 
      left = true; 
    } 
    public void rightTrue(){ 
      right = true; 
    } 
    

    【讨论】:

    • 大小似乎是正确的,但是所有条目的左/右和id都相同,我将编辑我的帖子,以便您查看我的代码的样子
    • 我怀疑这与您实际调用 registerSource() 和 registerTarget() 的方式有关。 registerSource(String linkId, DragNode linkNode) 和 registerTarget(String linkId, DragNode linkNode) 可能都引用同一个链接节点而不创建新链接节点。对吗?
    • 两者都引用不同的节点 public void bindEnds (DragNode source, DragNode target) {target.registerTarget (getId(), target);source.registerSource (getId(), source);} 当我之前使用我的代码时,我得到了不同的 ID,但来自同一个节点的不同条目(没有更新),现在我在前两个上得到了相同的 ID,并且第三个是另一个节点,在所有条目中左为假,右为真:/
    猜你喜欢
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 2023-03-07
    • 2012-08-13
    • 1970-01-01
    相关资源
    最近更新 更多