Java:获取ArrayList中指定元素之前是否存在元素

时间:2014-07-09 04:33:15

标签: java arraylist

public static boolean isComponentBefore(GuiInterface component) {
    int index = 0;

    for (int i = 0; i < components.size(); i++) {
        if (components.get(i).getName() == component.getName()) {
            if(components.get(i- 1) == null){
                return false;
            }
        }
    }

    return true;

}

我目前使用此功能,但这可能导致ConcurrentModificationExceptions&amp;它不起作用,因为每当我试图查看传入的元素之前的元素是否为null时,它一直在抛出ConcurrentModificationExceptions。

我想知道是否有其他方法可以做到这一点。

4 个答案:

答案 0 :(得分:1)

这一行

if (components.get(i).getName() == component.getName()) {

应该是

if (components.get(i).getName().equals(component.getName())) {

然而,你的病情永远不会发生。如果component.get(i-1)为null,则在前一循环迭代中

components.get(i).getName() // <-- null pointer exception, so

component.get(i-1)不能为空,您需要希望i不是0,否则您将获得超出范围的索引异常。

答案 1 :(得分:1)

根据您的逻辑,在给定的组件NullPointerException之前,ArrayListnull组成一个组件,因为components.get(i)将是nullcomponents.get(i).getName()将抛出NPE。

您可以尝试稍微更改逻辑。对于列表中的每个null元素,检查下一个组件是否是您要搜索的组件并相应返回。

for (int i = 0; i < components.size(); i++) {
    if (components.get(i) == null) { // If a particular element is null, check if the next element is what you want
        if(components.get(i+1).getName().equals(component.getName())) { // you need to handle the edge case for i+1 as well for the last iteration
            return false;
        }
    }
}

请注意,您需要使用equals()方法而不是==运算符来比较字符串。您还需要处理最后一次迭代的i+1的角落情况。

答案 2 :(得分:0)

使用迭代器

e.g

    int i = 0;
    Iterator<GuiInterface > it = components.iterator();
    while (it.hasNext()) {
        i++;
        GuiInterface  thisComp = it.next (); 
        if (thisComp.getName().equals(component.getName())) {
          if(i > 0 && components.get(i- 1) == null){  // this code does not make sense
            return false;
          }
        }

    }

答案 3 :(得分:0)

假设传递的组件不在您的列表中:

public static boolean isComponentBefore(GUIComponent component) {

    // Start at 1 to avoid IndexOutOfBounds
    for(int i = 1; i < components.size(); i++) {
        if (components.get(i).getName().equals(component.getName())) {
            return components.get(i - 1) != null;
        }
    }

    // Given component is not in the list, or the list only has one element
    return false;
}

假设列表中传递的组件

public static boolean isComponentBefore(GUIComponent component) {
    int index = components.indexOf(component);

    return index > 0 && components.get(index - 1) != null;
}