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

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

所以我要创建几个类来处理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

  1. public DVD add(String titlez, String categoryz, String runTimez, String yearz, String pricez) {
  2. Iterator<DVD> it = arraylist.iterator();
  3. DVD dvd = it.next();
  4. if(dvd.getTitle().equals(titlez)){
  5. return dvd;
  6. }
  7. else{
  8. DVD dvd1 = new DVD (titlez, categoryz, runTimez, yearz, pricez);
  9. arraylist.add(dvd1);
  10. return null;
  11. }
  12. }
  13. @Override
  14. public DVD remove(String title) {
  15. Iterator<DVD> it = arraylist.iterator();
  16. DVD dvd = it.next();
  17. if(dvd.getTitle().equals(title)){
  18. arraylist.remove(dvd);
  19. return dvd;
  20. } else {
  21. return null;
  22. }
  23. }
uoifb46i

uoifb46i1#

因为有人已经“回答”了,你不是在重复整个列表。
我已经重构了你的代码,使add和remove方法更干净。我创建了一个pojo(纯旧java对象)dvd和一个dvdservice,它有一个dvdstore。
dvdstore使用titlez作为“键”来存储dvd。add和remove方法使用exists方法检查dvd密钥是否在dvdstore中。
我为添加或删除返回true或false。我尝试添加两次新的dvd“film1”,然后删除两次。
运行的输出如下:

  1. film1 has been added = true
  2. film1 has been added = false
  3. film1 has been removed = true
  4. film1 has been removed = false

我已经删除了您正在使用的迭代器,并在hashmap中搜索“titlez”键。我还为add和remove返回一个“简单布尔值”。添加或删除已成功(true或false)。
这使得添加和删除易于理解和维护。

  1. import java.util.HashMap;
  2. import java.util.Map;
  3. class DVD {
  4. private String titlez;
  5. private String categoryz;
  6. private String runTimez;
  7. private String yearz;
  8. private String price;
  9. /**
  10. * DVD constructor
  11. *
  12. * @param titlez - title
  13. * @param categoryz - category
  14. * @param runTimez - length of file
  15. * @param yearz - year made
  16. * @param price - price
  17. */
  18. DVD(String titlez, String categoryz, String runTimez, String yearz, String price) {
  19. this.titlez = titlez;
  20. this.categoryz = categoryz;
  21. this.runTimez = runTimez;
  22. this.yearz = yearz;
  23. this.price = price;
  24. }
  25. /**
  26. * get DVD titlez
  27. * @return - DVD titlez
  28. */
  29. String getTitlez() {
  30. return titlez;
  31. }
  32. }
  33. public class DVDService {
  34. private Map<String, DVD> dvdStore; // DVD store - use DVD titlez to "look up" DVD
  35. /**
  36. * Convenience method for checking if a title exists in our DVD Store
  37. * @param titlez - DVD title
  38. * @return - true if exists in DVD store
  39. */
  40. private boolean exists(String titlez) {
  41. return dvdStore.containsKey(titlez);
  42. }
  43. /**
  44. * Add a DVD to the DVD store
  45. * @param dvd - DVD to be added
  46. * @return - true if DVD added
  47. */
  48. private boolean add(DVD dvd) {
  49. if (dvdStore == null) { // if DVD store is null - create it
  50. dvdStore = new HashMap<>();
  51. }
  52. // if title does NOT exist - add it to the DVD store and return true
  53. if (!exists(dvd.getTitlez())) {
  54. dvdStore.put(dvd.getTitlez(), dvd);
  55. return true;
  56. }
  57. return false; // title already exists
  58. }
  59. /**
  60. * Remove DVD from DVD store
  61. * @param dvd - DVD to be removed
  62. * @return - true if DVD removed
  63. */
  64. private boolean remove(DVD dvd) {
  65. if (exists(dvd.getTitlez())) {
  66. dvdStore.remove(dvd.getTitlez());
  67. return true;
  68. }
  69. return false;
  70. }
  71. public static void main(String[] args) {
  72. DVD dvd = new DVD("film1", "Mystery", "2 hours", "1971", "2.00");
  73. DVDService dvdService = new DVDService();
  74. /**
  75. * Add a DVD = true
  76. * Add again = false as it exists in the DVD store
  77. *
  78. * Remove DVD = true as it exists
  79. * Remove DVD = false as it no longer exists
  80. */
  81. System.out.printf("%s has been added = %s\n", dvd.getTitlez(), dvdService.add(dvd));
  82. System.out.printf("%s has been added = %s\n", dvd.getTitlez(), dvdService.add(dvd));
  83. System.out.printf("%s has been removed = %s\n", dvd.getTitlez(), dvdService.remove(dvd));
  84. System.out.printf("%s has been removed = %s", dvd.getTitlez(), dvdService.remove(dvd));
  85. }
  86. }
展开查看全部
izj3ouym

izj3ouym2#

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

  1. Iterator<DVD> it = arraylist.iterator();
  2. while(it.hasNext()) {
  3. DVD dvd = it.next();
  4. if(dvd.getTitle().equals(title)){
  5. arraylist.remove(dvd);
  6. return dvd;
  7. }
  8. }
  9. return null;
w80xi6nr

w80xi6nr3#

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

  1. public DVD add(String titlez, String categoryz, String runTimez, String yearz, String pricez) {
  2. for (DVD dvd : arrayList) {
  3. if(dvd.getTitle().equals(titlez)){
  4. return dvd;
  5. }
  6. }
  7. DVD dvd1 = new DVD (titlez, categoryz, runTimez, yearz, pricez);
  8. arraylist.add(dvd1);
  9. return null;
  10. }

你的 remove 方法也有类似的问题。改用这个:

  1. public DVD remove(String title) {
  2. for (DVD dvd : arrayList) {
  3. if (dvd.getTitle().equals(title)) {
  4. arrayList.remove(dvd);
  5. return dvd;
  6. }
  7. }
  8. return null;
  9. }

注意,这种风格有点危险。通常,您不应该在遍历列表时修改它。如果迭代继续,你会得到一个 ConcurrentModificationException 扔了。但是,由于在修改列表时也会立即停止迭代,所以应该没问题。有两种方法可以避免异常并仍然修改列表(1) 使用 ListIterator 而不是 Iterator ,因为 ListIterator 有自己的 remove() 您可以使用的方法。你得回到传统的生活 for 循环语法(2) 将删除推迟到迭代完成,如下所示:

  1. public DVD remove(String title) {
  2. DVD toRemove = null;
  3. for (DVD dvd : arrayList) {
  4. if (dvd.getTitle().equals(title)) {
  5. toRemove = dvd;
  6. break;
  7. }
  8. }
  9. if (toRemove != null) {
  10. arrayList.remove(toRemove);
  11. }
  12. return toRemove;
  13. }
展开查看全部

相关问题