簡體   English   中英

刪除元素並將其插入到歌曲標題數組中

[英]Deleting and inserting elements into an array of song titles

我正在學習如何自學在數組中刪除和插入元素。 這是我正在使用的數組,它只是一堆歌曲名稱:

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 循環來遍歷歌曲數組的長度。 我正在從數組中間刪除歌曲標題“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);
}

我假設你想專門使用數組,這樣你就可以練習 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來表示空槽。 請注意,您現在需要在對它們調用getTitle()之前檢查每個元素是否為null ,否則 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");
    }
}

作為對您的附加任務,嘗試使用此代碼並創建一個方法,您可以在任何歌曲數組上調用以從中刪除具有特定標題的歌曲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM