【问题标题】:ForLoop Continuously Looping inside Override Method AndroidForLoop在Override方法Android中不断循环
【发布时间】:2019-05-04 18:29:53
【问题描述】:

我有一个 接口,它的方法在其他类中实现。 在该方法中,我有 forLoop 来检查项目是否已经存在于特定的 List 中,但是 ForLoop 连续调用。
这是我的代码:

@Override
public void saveResultList(MyOrderResultPOJO myOrderResultPOJO) {

    myOrderResultList.add(myOrderResultPOJO);


    checkItemId(myOrderResultPOJO);

    //myOrderResultHashMap.put(inventoryClassificationId, myOrderResultList);
    setMyOrderResultListNew(myOrderResultList);
}

private boolean checkItemId(MyOrderResultPOJO myOrderResultPOJO){
    boolean v=false;

    for (int i=0;i<myOrderResultList.size();i++) {

        if (myOrderResultList.get(i).getItemId().equals(myOrderResultPOJO.getItemId())) {
            myOrderResultList.add(i,myOrderResultPOJO);
            Log.d("myOrderResultList","entering");
            v=true;
        }
    }

    return v;

}

界面:

public interface MyOrderSubList {
    void addMtPcsSpinner(Context ctx, Spinner spinner);

    void showMessages(String message);

    void hideKeyBoards();

    void saveResultList(MyOrderResultPOJO myOrderResultPOJO);
}

【问题讨论】:

  • 在 if 中添加一个 break 来停止循环。

标签: java android for-loop arraylist


【解决方案1】:

如果找到匹配项,您应该返回 true。您绝对不想再次将现有元素添加到ListmyOrderResultList.add(i,myOrderResultPOJO); 是导致无限循环的原因)。

private boolean checkItemId(MyOrderResultPOJO myOrderResultPOJO)
{
    for (int i=0;i<myOrderResultList.size();i++) {
        if (myOrderResultList.get(i).getItemId().equals(myOrderResultPOJO.getItemId())) {
            Log.d("myOrderResultList","entering");
            return true;
        }
    }

    return false;    
}

也就是说,调用者方法(saveResultList)的逻辑很奇怪。首先将元素添加到List,然后调用checkItemId(myOrderResultPOJO),它会检查它是否存在于List 中(并且忽略该方法返回的值)。应该是相反的:

public void saveResultList(MyOrderResultPOJO myOrderResultPOJO) 
{
    if (!checkItemId(myOrderResultPOJO)) {
        myOrderResultList.add(myOrderResultPOJO);
    }

    setMyOrderResultListNew(myOrderResultList);
}

【讨论】:

  • 如果元素存在,我想更新arraylist元素。
  • @SivabalanD 如果要更新现有元素,请使用 myOrderResultList.set(i,myOrderResultPOJO) 而不是 myOrderResultList.add(i,myOrderResultPOJO)
【解决方案2】:

您最终将添加到列表的 size 中,这就是您的 for 循环的条件是 i&lt;myOrderResultList.size()

myOrderResultList.add(i,myOrderResultPOJO); // not required

所以你可以更新到

for (int i = 0; i < myOrderResultList.size(); i++) {
    if (myOrderResultList.get(i).getItemId().equals(myOrderResultPOJO.getItemId())) {
        Log.d("myOrderResultList", "entering");
        v = true;
    }
}

【讨论】:

  • 但如果元素存在,我想更新数组列表。
  • @SivabalanD 是的,在这种情况下,Eran 的建议可以进一步帮助您。您目前正在使用您的解决方案添加到列表中,理想情况下,该解决方案应该是基于您的 checkItemId 方法的返回类型的条件。
猜你喜欢
  • 2012-05-23
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
相关资源
最近更新 更多