Java 从数组中删除对象

Java 从数组中删除对象,java,arrays,Java,Arrays,我在类音乐中有一个构造函数: protected String Title; protected String Autor; protected String Type; protected int Code; public Music (String title, String autor, String type, int code){ this.setTitle(title); this.setAutor(autor); this.setType(type);

我在类音乐中有一个构造函数:

protected String Title;
protected String Autor;
protected String Type;
protected int Code;

public Music (String title, String autor, String type, int code){
    this.setTitle(title);
    this.setAutor(autor);
    this.setType(type);
    this.setCode(code);
}

@Override
public String toString(){
    return this.Title + " " + this.Autor + " " + this.Type + " " + this.Code;
}
static ManageMusic musiclist = new ManageMusic(20);
musicList.add(new Music(title, autor, format, code));
然后,在另一个名为ManageMusic的类中,我创建了一些方法,然后在主类中使用它们。我还定义了一个字符串数组,该数组引用了我将在主类中使用的Music类:

private final Music[] musicList;
private int counter;

public ManageMusic(int maxSize) {
    musicList= new Music[maxSize];
    counter= 0;

public void add(Music m){
    musicList[counter] = m;
    counter++;
}
在这里,我必须创建一个delete方法,该方法将从musicList中删除一个特定的对象,并返回不包含该对象的列表

这是我将音乐元素添加到主类的音乐列表中的方式:

protected String Title;
protected String Autor;
protected String Type;
protected int Code;

public Music (String title, String autor, String type, int code){
    this.setTitle(title);
    this.setAutor(autor);
    this.setType(type);
    this.setCode(code);
}

@Override
public String toString(){
    return this.Title + " " + this.Autor + " " + this.Type + " " + this.Code;
}
static ManageMusic musiclist = new ManageMusic(20);
musicList.add(new Music(title, autor, format, code));
我在ManageMusic类中使用的delete方法是将此列表复制到一个新字符串[],然后将其复制回列表。但是,由于我使用的是来自音乐的对象,而不是来自字符串的对象,因此我无法将副本复制回,因为它不会将字符串投射到musicList:

public void delete(int code){
        String[] newString = new String[musicList.length];
        int index_1 = 0;
        for (int i=0; i<musicList.length; i++){
            if(i != code){
                newString[index_1] = musicList[i].toString();
                index_1++;
            }
        }
        int index_2 = 0;
        for (int i=0; i<newString.length; i++){  //THIS IS WHERE IT SAYS: Cannot convert
                                                 // from String to Music
            musicList[index_2] = newString[i];
            index_2++;
        }
    }
public void delete(int-code){
String[]newString=新字符串[musicList.length];
int指数_1=0;

对于(int i=0;i使用
ArrayList
比编写自己的逻辑从现有数组中删除对象要好。以下是使用ArrayList的方法:

{
    ArrayList<Music> list = new ArrayList<Music>();
    Music m1 = new Music(title, autor, format, code);
    list.add(m1);
    // similarly you can check whether object is present in ArrayList or not using
    if(list.contains(m1)){ // This check whether object is present in ArrayList or not
          //Do whatever you want
    }
}
{
ArrayList=新建ArrayList();
音乐m1=新音乐(标题、自动、格式、代码);
增加(m1);
//类似地,您可以使用以下命令检查对象是否存在于ArrayList中
如果(list.contains(m1)){//此检查对象是否存在于ArrayList中
//你想干什么就干什么
}
}

使用
ArrayList
比编写自己的逻辑从现有数组中删除对象要好。以下是使用ArrayList的方法:

{
    ArrayList<Music> list = new ArrayList<Music>();
    Music m1 = new Music(title, autor, format, code);
    list.add(m1);
    // similarly you can check whether object is present in ArrayList or not using
    if(list.contains(m1)){ // This check whether object is present in ArrayList or not
          //Do whatever you want
    }
}
{
ArrayList=新建ArrayList();
音乐m1=新音乐(标题、自动、格式、代码);
增加(m1);
//类似地,您可以使用以下命令检查对象是否存在于ArrayList中
如果(list.contains(m1)){//此检查对象是否存在于ArrayList中
//你想干什么就干什么
}
}
ArrayList示例:

List<Music> musicList = new ArrayList<Music>();
添加到列表中的指定位置(后面的位置都向上移动一个位置)

从列表中删除:

musicList.remove(index);

名单规模:

int size = musicList.size();
获取第一首音乐:

Music first = musicList.get(0);
获取最后一首音乐:

Music last = musicList.get(musicList.size()-1);
循环:

ArrayList示例:

List<Music> musicList = new ArrayList<Music>();
添加到列表中的指定位置(后面的位置都向上移动一个位置)

从列表中删除:

musicList.remove(index);

名单规模:

int size = musicList.size();
获取第一首音乐:

Music first = musicList.get(0);
获取最后一首音乐:

Music last = musicList.get(musicList.size()-1);
循环:

你喜欢这样吗

public void delete(int code){       
    List<Music> list = new ArrayList<Music>(); //creating new empty list
    for (Music m:musicList){
        if(m.code != code){ // removing condition
            list.add(m); // adding music to new list
        }
    }
    musicList = list.toArray(new Music[list.size()]); // assigning back list to musicList 
}
public void delete(int-code){
List List=new ArrayList();//创建新的空列表
音乐(m:musicList){
如果(m.code!=code){//删除条件
list.add(m);//将音乐添加到新列表
}
}
musicList=list.toArray(新音乐[list.size()]);//将后列表分配给musicList
}
你喜欢这样吗

public void delete(int code){       
    List<Music> list = new ArrayList<Music>(); //creating new empty list
    for (Music m:musicList){
        if(m.code != code){ // removing condition
            list.add(m); // adding music to new list
        }
    }
    musicList = list.toArray(new Music[list.size()]); // assigning back list to musicList 
}
public void delete(int-code){
List List=new ArrayList();//创建新的空列表
音乐(m:musicList){
如果(m.code!=code){//删除条件
list.add(m);//将音乐添加到新列表
}
}
musicList=list.toArray(新音乐[list.size()]);//将后列表分配给musicList
}

为什么不使用ArrayList就可以做到这一点

正如一些人在评论中建议的那样,您可能应该使用
java.util.collection
包中的ArrayList或类似内容

然而,我假设您想要了解这些东西是如何工作的,所以我不会向您提供代码(首先是因为我太懒,其次是为了鼓励您自己学习),而是提供一些解释

编辑:首先:您的问题是复制字符串,而不是引用。与其尝试使用toString方法,不如尝试使用“对象”(即它们的引用)本身来处理它

错误检查

您可能已经注意到,如果在列表达到最大值后尝试添加另一个条目,则您的
add
将导致
indexootfoundsexception
。您应该检查这一点。您还应该检查以下解释中的许多内容,我将提供一些建议

使用您的确切示例进行简单删除

只需使用Music[]而不是String[],并将临时Music[]的引用复制到musicList

更好的处理方法:动态数组结构

所以我建议使用一个动态数组结构。你需要大量复制数组,这可能有点困难。但基本上这就是ArrayList所做的

建造师

但如何实现这种动态结构呢?让我们首先从初始化开始,即构造函数。最大大小不需要参数(除非出于某种原因限制音乐收藏)。只需创建一个大小为0的数组即可。(当然,您也可以实现复制构造函数和其他功能,但首先要保持简单。)

添加()

要添加更多音乐,您只需创建一个新数组,其大小为当前收藏的+1,复制所有引用(这可能就是您要寻找的答案。您只需获取字符串,而只需获取对象本身)从当前数组到新数组,添加新的
Music
,并将成员变量的引用更改为新创建的更大数组(即赋值
musicList=tempArray;
或类似内容)。(错误检查:对象是否为空?)

删除()

对于删除,您也可以执行相同的操作。创建一个新的临时数组(这次减小了大小),复制所有值,但保留要删除的值。要确定要删除的值,您可以检查索引,甚至检查对象是否相等。(错误检查:临时数组的大小不应小于1,因此检查数组是否为空)考虑使用一种方法,如代码> iSunType()/<代码>。 Wh