删除元素并将其插入歌曲标题数组

时间:2019-01-02 17:35:51

标签: java arrays arraylist

我正在学习如何自学在数组中删除和插入元素。这是我正在使用的数组,只是一堆歌曲标题:

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);
}

1 个答案:

答案 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”的歌曲,该怎么办?尽量避免像这样脆弱的编码,并制定一种适用于任何数据的解决方案。

您有正确的想法,但您需要再考虑一点。让我们仔细考虑如何做到这一点。选择要删除的索引后,我们想要:

  1. chosenIndex开始遍历列表,
  2. 将每个索引处的元素替换为下一首歌曲的索引...
  3. 到达列表的末尾时除外,在这种情况下,我们需要将该元素设置为null

现在,我们将它们放在一起:

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");
    }
}

作为您的附加任务,请尝试采用以下代码并创建一种方法,您可以在任何数组的歌曲上调用该方法,以从其中删除具有特定标题的歌曲。