我正在学习如何自学在数组中删除和插入元素。这是我正在使用的数组,只是一堆歌曲标题:
public class Algorithms
{
public static void main ()
{Song[] topTenSongs = {new Song("The Twist"),
new Song ("Smooth"),
new Song ("Mack the Knife"),
new Song ("How Do I Live"),
new Song ("Party Rock Anthem"),
new Song ("I Gotta Feeling"),
new Song ("Macarena (Bayside Boys Mix)"),
new Song ("Physical"),
new Song ("You Light Up My Life"),
new Song ("Hey Jude")
};
String[] tenSongNames = {"The Twist",
"Smooth",
"Mack the Knife",
"How Do I Live",
"Party Rock Anthem",
"I Gotta Feeling",
"Macarena (Bayside Boys Mix)",
"Physical",
"You Light Up My Life",
"Hey Jude"};
for (int i = 0; i < topTenSongs.length; i++)
{topTenSongs [i].setTitle(tenSongNames[i]);
System.out.println(topTenSongs [i].getTitle());
}
我的目标是创建一个for循环以遍历songs数组的长度。我正在从数组中间删除歌曲标题“ I Gotta Feeling”。我想将数组中的下一首歌曲复制到当前位置,并继续进行迭代,将下一首歌曲替换到当前位置,直到到达数组末尾。然后,我想编写一个新的for循环以显示新的较短歌曲列表的内容(最后一个索引为9的最后一个位置,该数组现在应为“ null”)。
这是我到目前为止所拥有的。我对整个迭代过程感到困惑,在整个迭代过程中,我可以将歌曲列表移至较早的索引。
int chosenIndex = 0;
for (int i = 0; i <topTenSongs.length; i ++) {
if (topTenSongs[i].getTitle().equals("I Gotta Feeling")==true){
chosenIndex = i;}}
for (int i = chosenIndex; i < topTenSongs.length -1; i++) {
topTenSongs[i] = topTenSongs[i+1];
if(topTenSongs[i+1].getTitle().equals("Macarena (Bayside Boys Remix")==true){
chosenIndex = i+1;
String iteration = topTenSongs[i+1].getTitle();}
}
for (int i = 0; i< topTenSongs.length; i++) {
System.out.println(topTenSongs);
}
答案 0 :(得分:2)
我假设您要专门使用数组,以便您可以练习for循环,而不要这样做。否则,就像@CarlosHeuberger指出的那样,使用ArrayList
会容易得多。
让我们了解一下您目前的情况。
int chosenIndex = 0;
for (int i = 0; i <topTenSongs.length; i ++) {
if (topTenSongs[i].getTitle().equals("I Gotta Feeling")==true){
chosenIndex = i;}}
首先,请尝试使用常规的Java代码样式,以便您的代码尽可能地易于遵循。缩进和括号放置对可读性有很大帮助,例如:
int chosenIndex = 0;
for (int i = 0; i <topTenSongs.length; i ++) {
log.debug(topTenSongs[i].getTitle());
if (topTenSongs[i].getTitle().equals("I Gotta Feeling")) {
chosenIndex = i;
}
}
请注意,我删除了if语句的==true
部分,因为那是多余的。否则,它会正确找到您要删除的索引,从而在其中表现出色。
让我们看下一部分(再次使用正确的格式):
for (int i = chosenIndex; i < topTenSongs.length -1; i++) {
topTenSongs[i] = topTenSongs[i+1];
if(topTenSongs[i+1].getTitle().equals("Macarena (Bayside Boys Remix")){
chosenIndex = i+1;
String iteration = topTenSongs[i+1].getTitle();
}
}
说实话,我不确定您要在这里完成什么。看起来 就像您想将所有剩余的歌曲向左移动以填补空白一样,这是您在一开始所做的事情,但是我不知道循环第二部分的目的是什么。如果索引与特定歌曲匹配,那么您将跳过该索引,但是如果您使用其他数组,而没有匹配“ Macarena”的歌曲,该怎么办?尽量避免像这样脆弱的编码,并制定一种适用于任何数据的解决方案。
您有正确的想法,但您需要再考虑一点。让我们仔细考虑如何做到这一点。选择要删除的索引后,我们想要:
chosenIndex
开始遍历列表,现在,我们将它们放在一起:
for (int i = chosenIndex; i < topTenSongs.length; i++) {
if(i == topTenSongs.length-1) {
topTenSongs[i] = null; //set last element to null
} else {
topTenSongs[i] = topTenSongs[i+1];
}
}
现在,我们有一个数组,其中删除了您想要的歌曲,最后一个元素为null
,代表空插槽。请注意,您现在需要在调用null
之前检查每个元素是否不是getTitle()
,否则Java将抛出NullPointerException
。因此,您的打印循环必须看起来像这样:
for (int i = 0; i < topTenSongs.length; i++) {
if(topTenSongs[i] != null) {
System.out.println(topTenSongs[i].getTitle());
} else {
System.out.println("null");
}
}
作为您的附加任务,请尝试采用以下代码并创建一种方法,您可以在任何数组的歌曲上调用该方法,以从其中删除具有特定标题的歌曲。