2014-04-03 99 views
0

所以我在与将一个元素增加到一个ArrayList爪哇ArrayList.contains()&添加()方法

我有一个类Media 3个字段和另一类Mediatheque用1场这个问题(这是一个ArrayList)。

比方说,我有:

  • 一个Mediatheque media = new Mediatheque

  • equals(Media m)方法类Media <(重要的方法)

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

  • 如果media.contenu确实包含的元素equalsMedia m我要补充,我不能添加它,并增加包含元素的nbEx领域media.contenu

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

于是,我就写一个使用equals(Media m)方法我写的Mediacontains(Media)方法,然后使用contains方法add方法。

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

我必须用ArrayList来写这个,这是一个学校作业 对不起,关于长码和坏英文,我是一个完整的noob。

这里是我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方法?

对不起长代码和糟糕的英文,我是一个完整的noob。

谢谢!

+0

到底是什么限制吗? 'Media'类中的标题,还是'support'和'nbEx'也算在内? – Stefan

+0

为什么重新发明['ArrayList#contains']的轮子(http://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#contains-java.lang.Object- )? – ajp15243

+0

正如你已经实现了'equals'方法,为什么不使用'ArrayList.contains'? –

回答

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 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... 
} 

没有在媒体类中重写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 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类使用ArrayList

// 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... 
} 
+0

谢谢,先生,您的媒体类确实看起来更好。但我应该使用ArrayList,因为......好吧,学校很糟糕。 – Heuksal

+0

@ Heuksal:我已经更新了答案。您可以查看它,看看如何使用'ArrayList'编写特定的代码。 –

+0

这个问题可以简单地通过重写equals方法来解决。谢谢您的关注,先生。 – Heuksal

1

正如@NeplatnyUdaj在您的问题的评论中所述,使用Map将极大地改善您的代码。相反,记录媒体对象中媒体的数量,使用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方法。如果它不在列表中,我认为您想要将媒体添加到媒体。如果它在列表中,您希望将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); 
     } 
    } 
} 

希望这有助于。

+0

谢谢,先生。但是你写的包含方法似乎不起作用,我不知道为什么,但我觉得它总是返回false。 – Heuksal

+0

是的,可能是因为equals方法的签名是错误的:它是公共布尔(媒体媒体){...}而不是公共布尔(对象对象){...}。所以它没有重写由Object继承的equals方法,因此从未使用过。感谢您的评论。 – Kaschwenk