我在类音乐:
中有这个构造函数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语句。
答案 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而且知道它们的行为方式和原因而感到自豪。