如何迭代数组列表并根据条件添加或删除对象?

时间:2017-10-31 19:02:45

标签: java arraylist iterator

所以我正在制作一些处理DVD对象集合的类。我的添加和删除方法应该这样做:

add - 此方法用于添加新DVD。它应该有五个参数 表示DVD的标题,类别,运行时间,年份和价格。如果标题已经在DVD集合中,则无需添加或更改任何内容。否则,DVD将添加到集合中。如果DVD条目已在DVD集合中,则返回DVD条目;如果添加了新条目,则返回null。

删除 - 此方法应该有一个标题作为参数。它应该删除 如果找到标题,则从集合中获取DVD。它返回已删除的DVD条目,如果找不到标题则返回null。

我的方法目前仅适用于我的文本文件中的第一个对象,但是当我在文件的另一个对象中输入时,它只返回null。

我的文本文件包含以下6个对象。 亚当 记录 78分钟 2012 7.99 Choo Choo 记录 60分钟 2006年 11.99 早安美国 记录 80分钟 2010 9.99 生活是美好的 戏剧 125分钟 1999年 15.99 晨鸟 滑稽 150分钟 2008年 17.99 神秘河 神秘 130分钟 2002年 24.99

public DVD add(String titlez, String categoryz, String runTimez, String yearz, String pricez) {
            Iterator<DVD> it = arraylist.iterator();
            DVD dvd = it.next();
            if(dvd.getTitle().equals(titlez)){
            return dvd;
        }
        else{
            DVD dvd1 = new DVD (titlez, categoryz, runTimez, yearz, pricez);
            arraylist.add(dvd1);

            return null;
        }
    }

    @Override
    public DVD remove(String title) {
        Iterator<DVD> it = arraylist.iterator();
        DVD dvd =  it.next();
        if(dvd.getTitle().equals(title)){
            arraylist.remove(dvd);
            return dvd;
        } else {
            return null;
        }

    }

3 个答案:

答案 0 :(得分:2)

您没有循环整个列表尝试使用此代码:

Iterator<DVD> it = arraylist.iterator();    
while(it.hasNext()) {
    DVD dvd =  it.next();
    if(dvd.getTitle().equals(title)){
        arraylist.remove(dvd);
        return dvd;
    }
}
return null;

答案 1 :(得分:1)

您的add方法没有遍历列表;它只是测试第一个元素。 (如果你的列表是空的,它也会抛出异常。)试试这个,它会在决定标题不存在之前迭代整个列表。 (我使用enhanced for loop语法而不是传统的for循环。)

public DVD add(String titlez, String categoryz, String runTimez, String yearz, String pricez) {
    for (DVD dvd : arrayList) {
        if(dvd.getTitle().equals(titlez)){
            return dvd;
        }
    }
    DVD dvd1 = new DVD (titlez, categoryz, runTimez, yearz, pricez);
    arraylist.add(dvd1);

    return null;
}

您的remove方法存在类似问题。请改用:

public DVD remove(String title) {
    for (DVD dvd : arrayList) {
        if (dvd.getTitle().equals(title)) {
            arrayList.remove(dvd);
            return dvd;
        }
    }
    return null;
}
注意这是风格有点危险。通常,您不应该在迭代时修改列表。如果迭代继续,您将获得ConcurrentModificationException抛出。但是,由于您在修改列表时也会立即停止迭代,因此应该没问题。有两种方法可以避免异常并仍然修改列表。 (1)使用ListIterator代替Iterator,因为ListIterator拥有您可以使用的remove()方法。您必须回到传统的for循环语法。 (2)推迟删除直到迭代完成,如下所示:

public DVD remove(String title) {
    DVD toRemove = null;
    for (DVD dvd : arrayList) {
        if (dvd.getTitle().equals(title)) {
            toRemove = dvd;
            break;
        }
    }
    if (toRemove != null) {
        arrayList.remove(toRemove);
    }
    return toRemove;
}

答案 2 :(得分:0)

当某人已“回答”时,你并没有遍历整个列表。

我重构了你的代码,使添加和删除方法更清晰。我创建了一个POJO(普通的旧java对象)DVD,以及一个带有DVDStore的DVDService。

DVDStore使用titlez作为“密钥”存储DVD。 add和remove方法使用exists方法检查DVD密钥是否在DVDStore中。

对于添加或删除,我返回false为false。我尝试两次添加一个新的DVD“film1”,然后删除两次。

来自跑步的输出在这里:

film1 has been added = true
film1 has been added = false
film1 has been removed = true
film1 has been removed = false

我删除了您正在使用的迭代器,并在HashMap中搜索“titlez”键。我还返回一个“简单的布尔”来添加和删除。已添加或删除成功(真或假)。

这使得添加和删除易于理解和维护。

import java.util.HashMap;
import java.util.Map;

class DVD {
    private String titlez;
    private String categoryz;
    private String runTimez;
    private String yearz;
    private String price;

    /**
     * DVD constructor
     *
     * @param titlez - title
     * @param categoryz - category
     * @param runTimez - length of file
     * @param yearz - year made
     * @param price - price
     */
     DVD(String titlez, String categoryz, String runTimez, String yearz, String price) {
        this.titlez = titlez;
        this.categoryz = categoryz;
        this.runTimez = runTimez;
        this.yearz = yearz;
        this.price = price;
    }

    /**
     * get DVD titlez
     * @return - DVD titlez
     */
    String getTitlez() {
        return titlez;
    }
}


public class DVDService {
    private Map<String, DVD> dvdStore; // DVD store - use DVD titlez to "look     up" DVD

    /**
     * Convenience method for checking if a title exists in our DVD Store
     * @param titlez - DVD title
     * @return - true if exists in DVD store
     */
     private boolean exists(String titlez) {
        return dvdStore.containsKey(titlez);
     }


    /**
     * Add a DVD to the DVD store
     * @param dvd - DVD to be added
     * @return - true if DVD added
     */
       private boolean add(DVD dvd) {
           if (dvdStore == null) {  // if DVD store is null - create it
               dvdStore = new HashMap<>();
           }

           // if title does NOT exist - add it to the DVD store and return true
           if (!exists(dvd.getTitlez())) {
               dvdStore.put(dvd.getTitlez(), dvd);
               return true;
           }

           return false; // title already exists
        }


    /**
     * Remove DVD from DVD store
     * @param dvd - DVD to be removed
     * @return - true if DVD removed
     */
    private boolean remove(DVD dvd) {
        if (exists(dvd.getTitlez())) {
            dvdStore.remove(dvd.getTitlez());
            return true;
        }

        return false;
    }

    public static void main(String[] args) {
        DVD dvd = new DVD("film1", "Mystery", "2 hours", "1971", "2.00");

        DVDService dvdService = new DVDService();

        /**
         * Add a DVD = true
         * Add again = false as it exists in the DVD store
         *
         * Remove DVD = true as it exists
         * Remove DVD = false as it no longer exists
         */

        System.out.printf("%s has been added = %s\n", dvd.getTitlez(), dvdService.add(dvd));

        System.out.printf("%s has been added = %s\n", dvd.getTitlez(), dvdService.add(dvd));

        System.out.printf("%s has been removed = %s\n", dvd.getTitlez(), dvdService.remove(dvd));

        System.out.printf("%s has been removed = %s", dvd.getTitlez(), dvdService.remove(dvd));
    }
}