2014-09-10 4 views
-1

im довольно новый при кодировании. У меня есть множество фильмов. Что я пытаюсь сделать, это удалить фильм с наименьшим количеством продаж. В моем методе «remover», расположенном в классе кассовых сборов, я получаю сообщение об ошибке «int не может быть разыменован» в строке, включая этот код »((movies.get (i) .sales) .equals (small))». также я назвал метод remove, чтобы удалить его из массива, но я угадал, что удаление isnt законно в 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

+0

its = new ArrayList <> хотя, значит, это не массив? –

+0

В то время как 'ArrayList' использует массив в качестве резервного хранилища, вы не работаете с ним напрямую. В этом отношении, поскольку 'movies' объявлен как« List 'как его тип, он может быть создан как« LinkedList »или« CopyOnWriteArrayList », а другой код останется прежним. Это связано с тем, что вы программируете против интерфейса «List», а не «ArrayList». – Powerlord

ответ

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

ява 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) Loop все фильмы, проверяя каждый, если продажи ниже самого низкого до сих пор 3) Если они ниже, то обновите ссылку на фильм с наименьшим количеством продаж 4) Наконец, удалите фильм с наименьшим количеством продаж из списка, с помощью ссылки на объект

+0

вы можете объяснить, как работает этот код, что делает int min = Integer.MAX_VALUE; do, –

+0

Я изменил его с тех пор, но 'int min = Integer.MAX_VALUE' просто устанавливает вашу переменную' min' в большое число, чтобы позволить 'sales' быть меньше. Если 'min' было' 0', тогда ничего не было бы меньше (если у вас не было отрицательных продаж) – DairyLea

+0

Хорошо, спасибо, я понимаю. –