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

omvjsjqw  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(450)

所以我要创建几个类来处理dvd对象的集合。我的add和remove方法应该执行以下操作:
添加–此方法用于添加新的dvd。它应该有五个参数来表示dvd的标题、类别、运行时间、年份和价格。如果标题已在dvd收藏中,则无需添加或更改任何内容。否则,dvd将添加到收藏中。如果dvd集合中已有dvd条目,则返回该条目;如果添加了新条目,则返回null。
remove–此方法应具有标题作为参数。如果找到了标题,它应该从收藏中删除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;
        }

    }
uoifb46i

uoifb46i1#

因为有人已经“回答”了,你不是在重复整个列表。
我已经重构了你的代码,使add和remove方法更干净。我创建了一个pojo(纯旧java对象)dvd和一个dvdservice,它有一个dvdstore。
dvdstore使用titlez作为“键”来存储dvd。add和remove方法使用exists方法检查dvd密钥是否在dvdstore中。
我为添加或删除返回true或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”键。我还为add和remove返回一个“简单布尔值”。添加或删除已成功(true或false)。
这使得添加和删除易于理解和维护。

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));
    }
}
izj3ouym

izj3ouym2#

您没有在整个列表上循环尝试改用此选项:

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

w80xi6nr3#

你的 add 方法没有遍历列表;只是测试第一个元素(如果您的列表为空,它也会抛出一个异常。)请改为尝试此操作,它会在确定标题不存在之前遍历整个列表(我用的是增强型的 for 循环语法而不是传统的 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;
}

相关问题