[英]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”匹配的歌曲怎么辦? 盡量避免像這樣的脆弱編碼,並制定一個適用於任何數據的解決方案。
你的想法是對的,但你需要再仔細考慮一下。 讓我們想想如何做到這一點。 當我們選擇了要刪除的索引時,我們希望:
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
來表示空槽。 請注意,您現在需要在對它們調用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.