2014-04-03 96 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