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

时间:2014-04-03 13:01:23

标签: java arrays arraylist add contains

所以我在将一个元素添加到ArrayList

时遇到了这个问题

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

我们说我有:

  • A 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方法?

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

谢谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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);
        }
    }
}

希望这有帮助。

答案 2 :(得分: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;
  }
}

这是一个使用MediaList的{​​{1}}课程:

ArrayList