所以我在将一个元素添加到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
方法?
对于长代码和糟糕的英语,我很抱歉,我是一个完整的菜鸟。
谢谢!
答案 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