Java ArrayList.contains()和add()方法

问题描述 投票:0回答:3

所以我在向ArrayList添加元素时遇到了这个问题

我有一个带有3个字段的类Media和带有1个字段的另一个类Mediatheque(这是一个ArrayList)。

比方说我有:

  • 一个Mediatheque media = new Mediatheque
  • equals(Media m)中的Media方法<(重要方法)

我需要写一个方法add(Media m)

  • 如果media.contenu确实包含我要添加的equals元素Media m,我不能添加它并增加nbEx中包含的元素的media.contenu字段

-Else我可以使用add提供的ArrayList方法添加它(这似乎不太难)

所以我试着写一个contains(Media)方法,它使用我为equals(Media m)类编写的Media方法,然后在contains方法中使用add方法。

我的问题是我应该如何编写add方法? <(问题)

我必须用ArrayList写这个,这是一个学校作业抱歉长代码和坏英语,我是一个完整的菜鸟。

这是我的Media课程:

package Ex1;

public class Media {
    private final String support; // Format: Book, CD, DVD,etc...
    private final String titre; // Title
    private int nbEx; // Number of copy

    public Media(String titre, String support){
        this.titre = titre;
        this.support = support;
        this.nbEx = 1;
    }

    public Media (){
        titre = "";
        support = "";
        nbEx = 0;
    }

    public boolean equals(Media m){
        boolean equality = false;
            if (m instanceof Media){
                equality = (this.titre.equals(m.titre) && this.support.equals(m.support));
            }
        return equality;
    }

    public Media(Media m){
        this.titre = m.titre;
        this.support = m.support;
    }
}

这是我的Mediatheque课程:

import java.util.ArrayList;
import static java.lang.System.out;

public class Mediatheque {
    ArrayList<Media> contenu;

    public Mediatheque(){
        this.contenu = new ArrayList<Media>();
    }

    public Mediatheque(Mediatheque m){
        this.contenu = m.contenu;
    }

    public boolean contains(Media m){
        int i = 0;
        boolean contain = this.contenu.get(i).equals(m);
        for(i = 0; i<this.contenu.size(); i++){
            if(contain)
                break;
        }
        return contain;
    }

    public int indexOf(Media m){
        boolean retVal = this.contenu.get(i).equals(m);
        for(Media i : contenu){
            if(contain)
                break;
        }
        return i;
    }

    public void add(Media m){
        if(this.contains(m)){
            this.contenu.get(this.contenu.indexOf(m)).setNbEx(this.contenu.get(this.contenu.indexOf(m)).getNbEx()+m.getNbEx());
        }else{
            this.contenu.add(m);
        }
    }

我的问题是我应该如何编写add方法?

抱歉,长码和糟糕的英语,我是一个完整的菜鸟。

谢谢!

java arrays arraylist add contains
3个回答
0
投票

当一个覆盖equals()方法时,也应该覆盖hashCode()方法。 equals()方法采用Object参数。以下是您的Media类应该如何:

// Media.java
public class Media
{
  private final String support;
  private final String title;

  public Media(String title, String support)
  {
    this.title = title;
    this.support = support;
  }

  public Media(Media media)
  {
    this(media.title, media.support);
  }

  @Override
  public int hashCode()
  {
    return 31 * title.hashCode() + support.hashCode();
  }

  @Override
  public boolean equals(Object object)
  {
    if (object instanceof Media)
    {
      Media media = (Media) object;

      return media.title.equals(title) &&
             media.support.equals(support);
    }

    return false;
  }
}

然后使用HashMap将媒体映射到其副本数。这是如何完成的:

// MediaMap.java
import java.util.HashMap;
import java.util.Map;

public class MediaMap
{
  // Media to its Number of Copies mapping.
  private Map<Media, Integer> mediaMap;

  public MediaMap()
  {
    mediaMap = new HashMap<>();
  }

  public void add(Media media)
  {
    mediaMap.put(media, mediaMap.getOrDefault(media, 0) + 1);
  }

  public void removeOneMedia(Media media)
  {
    if (mediaMap.containsKey(media))
    {
      mediaMap.put(media, mediaMap.get(media) - 1);
    }
  }

  // And so on...
}

如果不覆盖Media类中的hashCode()方法,基于哈希的集合将无法按预期工作。

您还可以查看MultiSet数据结构,并使用它。

如果你要使用ArrayList,那么这就是它的完成方式:

// Media.java
public class Media
{
  private final String support;
  private final String title;
  private int numberOfCopies;

  public Media(Media media)
  {
    this(media.title, media.support, media.numberOfCopies);
  }

  public Media(String title, String support, int numberOfCopies)
  {
    this.title = title;
    this.support = support;
    this.numberOfCopies = numberOfCopies;
  }

  @Override
  public int hashCode()
  {
    return 31 * title.hashCode() + support.hashCode();
  }

  @Override
  public boolean equals(Object object)
  {
    if (object instanceof Media)
    {
      Media media = (Media) object;

      return media.title.equals(title) &&
             media.support.equals(support);
    }

    return false;
  }

  public int getNumberOfCopies()
  {
    return numberOfCopies;
  }

  public void setNumberOfCopies(int numberOfCopies)
  {
    this.numberOfCopies = numberOfCopies;
  }
}

这是一个使用MediaListArrayList类:

// MediaList.java
import java.util.ArrayList;

public class MediaList
{
  private ArrayList<Media> mediaList;

  public MediaList()
  {
    mediaList = new ArrayList<>();
  }

  public void add(Media media)
  {
    set(media, +1);
  }

  public void remove(Media media)
  {
    set(media, -1);
  }

  private void set(Media media, int change)
  {
    if (change == 0)
    {
      return;
    }

    int indexOfMedia = mediaList.indexOf(media);

    if (indexOfMedia != -1)
    {
      Media m = mediaList.get(indexOfMedia);
      m.setNumberOfCopies(m.getNumberOfCopies() + change);

      if (change < 0 && m.getNumberOfCopies() <= 0)
      {
        mediaList.remove(media);
      }
    }
    else if (change > 0)
    {
      mediaList.add(media);
    }
  }

  // And so on...
}

1
投票

正如@NeplatnyUdaj在你的问题的评论中所说,使用Map会大大改善你的代码。不要记录Media对象内的媒体数量,而是使用HashMap<Media, Integer>以这种方式存储数据:

new HashMap<Media, Integer> map = new HashMap<Media,Integer>();

if ( map.containsKey(key) ) {
    map.put(key, (map.get(key) + 1));
} else {
    map.put(key, 1);
}

key是媒体的地方。 (代码中的m


0
投票

我稍微重构了你的课程。我还实现了一个add方法。我假设您想要将媒体添加到mediatheque,如果它不在列表中。如果它在列表中你想将nbex添加到列表中项目的nbex,对吧?和其他人一样,如果您不需要媒体对象的编号,我建议您使用HashMap()进行计数。

Media.class

public class Media {
    private final String support; // Format: Book, CD, DVD,etc...    
    private final String titre; // Title    
    private int nbEx; // Number of copy

    public Media(String titre, String support){
        this.titre = titre;
        this.support = support;
        this.nbEx = 1;
    }

    public Media(Media m){
        this(m.titre, m.support);
    }

    public Media (){
        this("", "");
        nbEx = 0;
    }

    public boolean equals(Media m){
            if (m instanceof Media){
                return (this.titre.equals(m.titre) && this.support.equals(m.support));
            }
        return false;
    }
}

Mediatheque.class

public class Mediatheque {
    ArrayList<Media> contenu;

    public Mediatheque(){
        this.contenu = new ArrayList<Media>();
    }

    public Mediatheque(Mediatheque m){
        this.contenu = m.contenu;
    }

    public boolean contains(Media m){
        for(Media media: this.contenu) {
            if(media.equals(m) {
                return true;
            }
        }
        return false;
    }

    public int indexOf(Media m){
        if(this.contenu.contains(m) {
            return this.contenu.indexOf(m);
        }
        return -1;
    }

    public void add(Media m){
        if(this.contains(m)) {
            Media media = this.contenu.get(this.contenu.indexOf(m));    
            media.setNbex(media.getNbex() + m.getNbex());
        } else {
            this.contenu.add(m);
        }
    }
}

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.