所以我在向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
方法?
抱歉,长码和糟糕的英语,我是一个完整的菜鸟。
谢谢!
当一个覆盖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
的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...
}
正如@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
)
我稍微重构了你的课程。我还实现了一个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);
}
}
}
希望这可以帮助。