2012-11-25 98 views
1

我是編程新手。我有這樣一段代碼:if-else inside for each loop

public void findFilm (String nameofFilm) { 
    int index = -1; 
    int i = 0; 
    for(Film aFilm : list) { 
     if(aFilm.gettitle().equals(nameofFilm)) { 
     index = i; 
     i++; 
     break ; 
     } 
    } 
    if(index >= 0) { 
     aFilm.print(); 
    } 
    else { 
     System.out.println(
     "The film " + nameofFilm + " does not belong to the collection"); 
     } 
    } 

更具體地說,我要搜索列表,找到它是否包括與同這個我插入一個名字的影片。有任何想法嗎 ?非常感謝。

+4

什麼是你的問題?編譯錯誤?運行時錯誤? – rene

+2

我認爲這是[codereview.SE]的問題。不過,我認爲你的代碼很好。 – rekire

+0

究竟是什麼問題? – giorashc

回答

1

aFilm只是for循環的本地,您需要在for循環內打印它。

public void findFilm (String nameofFilm) { 
    for(Film aFilm : list) { 
     if(aFilm.gettitle().equals(nameofFilm)) { 
     aFilm.print(); 
     return; 
     } 
    } 
    System.out.println(
     "The film " + nameofFilm + " does not belong to the collection"); 
} 
+0

我更喜歡在沒有打印任何內容的情況下返回電影(最終爲空)。 – Aubin

+2

然後在循環內部返回aFilm並在其外部返回null。 –

1

aFilm變量在for循環中定義。它的範圍因此僅限於循環,變量不能在循環外部使用。你可以這樣改寫循環:

Film foundFilm = null; 
for (Film aFilm : films) { 
    if (aFilm.getTitle().equals(nameOfFilm)) { 
     foundFilm = aFilm; 
     break; 
    } 
} 
if (foundFilm == null) { 
    ... 
} 
else { 
    ... 
} 

不需要任何索引或遞增計數器。

而且,爲了使代碼更清潔,你可以提取第一部分到它自己的方法,並把它改寫這樣的:

Film foundFilm = findFilmByTitle(films, filmTitle); 
if (foundFilm == null) { 
    ... 
} 
else { 
    ... 
} 
+0

你應該在回答之前都查找現有的答案。 @Garret Hall已經用相同的解決方案回答了這個問題 – giorashc

+0

@giorashc:瞭解併發系統中的競爭條件。而且,我認爲我的答案帶來了其他答案沒有的一些觀點。 –

+0

我也發現Garret的答案非常不同,並且不理想。它混合找到一個電影並打印它。我的答案乾淨地分離了兩個部分。 –

0

使用數據索引就像一張地圖:

SortedMap< String, Film > filmsByTitle = new TreeMap<>(); 
... 
if(! filmsByTitle.contains(newFilm.getTitle()) { 
    filmsByTitle.put(newFilm.getTitle(), newFilm); 
} 
0

你可以選擇一種功能性的方法,例如經由Guava

public boolean containsFilm(List<Film> list, final String nameOfFilm) { 
    Film film = Iterables.find(list, new Predicate<Film>() { 
     @Override 
     public boolean apply(Film film) { 
      return film.getTitle().equals(nameOfFilm); 
     } 
    }, null); 
    return film != null; 
} 

此外,我建議防守檢查null(薄膜,標題等)。我已經離開了檢查,以保持簡單的例子。

+1

如果影片不在那裏,上面的方法會拋出NoSuchElementException異常。您將需要使用重載的find()方法以默認值作爲參數(在這種情況下爲null)。 –

+0

確實很好,趕上 - 謝謝你!我會調整這個例子... – netzwerg