if-else在for-each循环中

时间:2012-11-25 12:44:32

标签: java loops if-statement foreach

我是编程新手。我有这段代码:

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

更具体地说,我想搜索列表并查找它是否包含名称与此i插入相同的电影。有任何想法吗 ?非常感谢。

4 个答案:

答案 0 :(得分: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");
}

答案 1 :(得分:1)

{for}循环中定义了aFilm变量。因此它的范围仅限于循环,并且变量不能在循环外使用。你可以用这种方式重写循环:

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 {
    ...
}

答案 2 :(得分:0)

使用像地图这样的数据索引:

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

答案 3 :(得分: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(电影,标题等)。我离开了支票以保持示例简单。