从数组中删除对象

时间:2013-11-29 10:04:14

标签: 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);
    this.setCode(code);
}

@Override
public String toString(){
    return this.Title + " " + this.Autor + " " + this.Type + " " + this.Code;
}

然后,在其他名为 ManageMusic 的类中,我创建了一些方法然后在主类上使用它们。我还定义了一个引用Music类的String数组,我将在主类中使用它:

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中删除一个特定对象,并在没有该对象的情况下返回此列表。

这是我将音乐元素添加到主要类上的 musicList 的方式:

static ManageMusic musiclist = new ManageMusic(20);
musicList.add(new Music(title, autor, format, code));

我对ManageMusic类中删除方法的方法是将此列表复制到新的String []中,然后将其复制回列表。但是当我使用来自音乐而不是字符串的对象时,我无法复制回来,因为它没有将字符串转换为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++;
        }
    }

我必须做一些与此不远的事情,因为我有一个方法列出了musicList中的元素,所以我不能为该方法设置一个return语句。

4 个答案:

答案 0 :(得分:1)

最好使用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
    }
}

答案 1 :(得分:1)

ArrayList示例:

List<Music> musicList = new ArrayList<Music>();

添加到列表结尾列表:

musicList.add(new Music(...));

添加到列表中的指定位置(后面的位置都向上移动一个位置)

musicList.add(index, new Music(..));

从列表中删除:

musicList.remove(index);

musicList.remove(someMusic);

清单大小:

int size = musicList.size();

获取第一首音乐:

Music first = musicList.get(0);

获取最后的音乐:

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

循环:

for (Music : musicList) {
  //do stuff
}

答案 2 :(得分: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 
}

答案 3 :(得分:1)

为什么没有ArrayList

就能做到这一点

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

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

编辑:第一:你的问题是你复制字符串,而不是引用。不要尝试使用toString方法,而是尝试使用“对象”(即它们的引用)本身来处理它。

检查错误

您可能已经注意到,如果您在列表达到max_size后尝试添加其他条目,则add会导致IndexOutOfBoundsException。你应该检查一下。您还应该在以下解释中查看很多内容,我将提供一些建议

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

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

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

所以我建议使用动态数组结构。你将不得不重复复制数组,这可能有点困难。但基本上它就是ArrayList的功能。

构造

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

加()

要添加更多音乐,您只需创建一个新数组,其当前集合的大小为+ 1,复制所有引用(这可能是您正在寻找的答案。您接受字符串,但只需将对象本身从当前数组转移到新数组,添加新的Music并将成员变量的引用更改为新创建的更大数组(即分配musicList = tempArray;或类似的东西)。 (错误检查:对象是否为空?)

删除()

对于删除,你也可以这样做。创建一个新的临时数组(这次减小了大小),复制所有值但忽略了要删除的值。要确定哪些应删除,您可以检查索引甚至检查对象是否相等。 (错误检查:临时数组的大小不应小于1,因此请检查您的数组是否为空 - 考虑使用类似isEmpty()的方法。)

我为什么要这样做?

获得这些概念后,您将能够以任何您喜欢的方式管理阵列。搜索它,删除所有元素,将您的音乐集合复制到您的朋友等等。

除此之外?

在你学会了这个之后,继续尝试一下ArrayList - 你会发现它的工作方式与你刚刚编写的非常相似。现在你可以为自己不仅可以使用ArrayLists而且知道它们的行为方式和原因而感到自豪。