2014-09-10 89 views
-1

即时编码相当新颖。我有一系列电影。我试图做的是删除销售数量最少的电影。在位于票房类的我的方法“卸妆”中,我收到一条错误消息,说明“int can not be dereferenced”,包括此代码“((movies.get(i).sales).equals(small))”。我也调用remove方法从数组中删除它,但即时通讯猜测删除不合法的Java。我需要做什么调用才能将其从阵列中移除并更新长度。如何删除字符串数组中的元素

import java.util.*; 
public class LIANGLAB1p2 
{ 
    public static void main(String[] argv) 
    { 
     BoxOffice bo = new BoxOffice(); 
     bo.add(new Movie("starboat","pg","action")); 
     bo.add(new Movie("bloody banquet","pg-13","horror")); 
     bo.add(new Movie("godizilla eats tokyo","pg","horror")); 
     bo.add(new Movie("geeks in love","pg","comedy")); 
     bo.add(new Movie("bad cop, worse cop","r","comedy")); 
     bo.add(new Movie("lost of bullets","r","action")); 
     bo.add(new Movie("the eliminator","r","action")); 
     bo.add(new Movie("the garbage collector","pg","comedy")); 
     bo.add(new Movie("the dentist","r","comedy")); 
     bo.add(new Movie("the professor","r","horror")); 
     bo.add(new Movie("bloody noon", "r", "action")); 

     for(int i=0;i<200;i++) bo.sellticket("the professor"); 
     for(int i=0;i<100;i++) bo.sellticket("starboat"); 
     for(int i=0;i<120;i++) bo.sellticket("the eliminator"); 
     for(int i=0;i<10;i++) bo.sellticket("bloody banquet"); 
     for(int i=0;i<40;i++) bo.sellticket("the dentist"); 
     for(int i=0;i<25;i++) bo.sellticket("geeks in love"); 
     bo.listmovie(); 
     bo.genrecounter(); 
     System.out.println("The most popular genre is " +bo.genrecounter()); 
     System.out.println("The most popular movie is " +bo.mostpopular()); 



     System.out.println("The sales have been reset to 0"); 
     bo.reset(); 


    } 
} 
class Movie 
{ 
    public int sales; 
    public int genr; 
    public String title; 
    public String rating; 
    public String genre; 

    public Movie (String t, String r, String g){ 
     title = t; rating = r; genre = g; sales = 0; genr = 0; 
    } 
    public String toString(){ 
     return title+ " - rated " +rating+" - genre: "+genre; 
    } 
} 

class BoxOffice{ 

    List<Movie> movies = new ArrayList<>(); 

    public double ticketprice; 
    public void changeprice(double newprice){  
     ticketprice = newprice; 
    }//changeprice 

    public BoxOffice(){     // constructor 
     ticketprice = 10.00; 
    }//BoxOffice 

    public void add(Movie m){   //adds movie 
     movies.add(m); 
    }//add 

    public void listmovie(){   //prints list of all movies 
     for (int i=0; i<movies.size(); i++) 
     { 
      System.out.println(movies.get(i).toString()); 
     } 
    }//listmovie 

    public int get(String t){   //gets movie by title 
     for (int i=0; i<movies.size(); i++) 
      if (t.equals(movies.get(i).title)){ 
       return i; 
      } 
      return -1; 
    }//get 

    public void sellticket(String m){ 
     int i = get(m); 
     if (i>=0) 
      movies.get(i).sales +=1; 
     else 
      System.out.println("that movie is currently not showing"); 
    }//sellticket 

    public String mostpopular() { //returns name of most popular movies 
     String ax = ""; 
     int bx = -1; 
     for (int i=0;i<movies.size();i++) 
      if (movies.get(i).sales>bx) 
      { 
       ax = movies.get(i).title; 
       bx = movies.get(i).sales; 
      } 
     return ax; 
    }//mostpopuler 

    public void reset(){ 
     for (int i=0;i<movies.size();i++){ 
      movies.get(i).sales = 0; 
     } 
    } 

    public void remover(){ 
     int small = movies.get(0).sales; 
     for (int i=0;i<movies.size();i++){ 
      if (movies.get(i).sales < small) 
       small = movies.get(i).sales; 
      } 
     for (int i=0;i<movies.size();i++){ 
      if ((movies.get(i).sales).equals(small)) 
       remove(movies.get(i)); 
     } 
    } 

    public String genrecounter(){ //returns most populer genre 
     int horror = 0; 
     int action = 0; 
     int comedy = 0; 
     for (int i=0;i<movies.size();i++) 
      if ((movies.get(i).genre).equals("horror")){ 
       horror++; 
      } 
      else if((movies.get(i).genre).equals("comedy")){ 
       comedy++; 
      } 
      else { 
       action++; 
      } 
     if (horror > action || horror > comedy){ 
      return "horror"; 
     } 
     else if (action > comedy || action > horror){ 
      return "action"; 
     } 
     else { 
      return "comedy"; 
     } 
    } 


}//BoxOffice 
+0

尽管你一直在说'数组','movies'是一个['List'](http://docs.oracle.com/javase/8/docs/api/java/util/List.html)。 – Powerlord 2014-09-10 19:17:58

+0

its = new ArrayList <>虽然,所以它不是一个数组? – 2014-09-10 19:29:26

+0

虽然'ArrayList'确实使用数组作为其后备存储,但您不直接对其进行操作。对于这个问题,因为'movies'被声明为'List '作为它的类型,所以它可以创建为'LinkedList '或'CopyOnWriteArrayList ',其他代码将保持不变。这是因为你是针对'List'接口进行编程的,而不是'ArrayList'。 – Powerlord 2014-09-10 19:31:48

回答

2

如果movies.get(i).sales返回int,则不能在其上调用.equals(或任何实例方法)中,由于int是基本类型。改为使用movies.get(i).sales == small

至于从ArrayList中删除一个项目,你可以使用movies.remove(i)来做到这一点,但是请注意,作为副作用,这将改变列表中所有索引> i的元素的索引,所以如果你继续迭代在删除之后在列表中,您应该再次处理第i个元素。

因此,应改变环路内remover到:

for (int i=0;i<movies.size();i++){ 
     if (movies.get(i).sales==small) { 
      movies.remove(i); 
      i--; 
     } 
    } 
0

一个java List确实有一个删除的方法,其中,可以指定所述索引或对象以移除。所以,你的代码可以简化为:

public void remover() { 
    Movie smallest = movies.get(0); 
    for (Movie movie:movies) { 
     if (movie.sales < smallest.sales) { 
      smallest = movie; 
     } 
    } 
    movies.remove(smallest); 
} 

一个简单的解释: 1)获取的第一部电影,最初将其设置为电影最低的数字销售 2)循环中的所有电影,检查每个如果销售低于目前的最低价 3)如果它们较低,则更新对销售数量最小的电影的参考 4)最后,通过对象参考

从列表中删除销售量最低的电影
+0

你能解释这段代码是如何工作的吗?int min = Integer.MAX_VALUE; – 2014-09-10 19:25:16

+0

从那时起,我改变了它,但'int min = Integer.MAX_VALUE'只是将'min'变量设置为一个很大的数值,以允许'sales'变小。如果'min'为'0',那么没有什么会更小(除非你有负面的销售) – DairyLea 2014-09-10 19:28:53

+0

好的谢谢,我明白了。 – 2014-09-10 19:32:17

相关问题