2016-11-08 8 views
0

In dem folgenden Code möchte ich indexOf() verwenden, aber ich kann den richtigen Weg nicht finden.Verwenden Sie indexOf mit einer ArrayList, die mehrere Objekte hat

Filmklasse:

public class Movie { 


    private String title; 
    private String genre; 
    private String actor; 
    private int yearPublished; 

    public Movie(String title, String genre, String actor, int yearPublished) { 
     this.title = title; 
     this.genre = genre; 
     this.actor = actor; 
     this.yearPublished = yearPublished; 
    } 

    @Override 
    public String toString() { 
     return title + ", Genre: " + genre + ", Actor(s):" + actor + ", Year of publishing: " + yearPublished; 
    } 



    public String getTitle() { 
     return title; 
    } 

    public String getGenre() { 
     return genre; 
    } 

    public String getActor() { 
     return actor; 
    } 

    public int getYearPublished() { 
     return yearPublished; 
    } 


} 

Controller-Klasse:

public class Controller { 

    void start() { 
     scanning(); 
     printing("Movies:"); 
     selectYourMovie(); 

    } 

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

    private void scanning() { 
     try { 
      Scanner fileScanner = new Scanner(new File("movies.txt")); 

      String row; 
      String []data; 

      while (fileScanner.hasNextLine()) {  
       row = fileScanner.nextLine(); 
       data = row.split(";"); 
       movies.add(new Movie(data[0], data[1], data[2], Integer.parseInt(data[3]))); 

      } 
     } catch (FileNotFoundException ex) { 
      Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 

    private void printing(String cim) { 
     for (Movie movie : movies) { 
      System.out.println(movie); 
     } 
    } 

    private void selectYourMovie() { 

     System.out.println(movies.indexOf(/*What to put here?*/); 
    } 

} 

Und der Inhalt der txt-Datei:

The Matrix;action;Keanu Reeves;1999 

The Lord of the Rings;fantasy;Elijah Wood;2001 

Harry Potter;fantasy;Daniel Radcliffe;2001 

The Notebook;drama;Ryan Gosling;2004 

Step Up;drama, dance;Channing Tatum;2006 

Pulp Fiction;crime;Samuel L. Jackson, John Travolta;1994 

Star Wars: A New Hope;action;Mark Hamill;1977 

So würde ich den Index des gegebenen zurückkommen Film, aber ich konnte nicht finden, wie man es mit einer Liste tut, die mehrere Gegenstände hat. Da passiert eine ganze Zeile des Txt nicht.

Hinweise dazu?

Antwort

2

Sie können natürlich die List#indexOf(T) Methode verwenden. Um dies richtig durchzuführen, implementieren Sie die Methode Object#equals erneut in Ihrem Movie-Objekt.

3

ArraysList nutzt gleich bei der Durchführung des Verfahrens indexOf

Blick:

public int indexOf(Object o) { 
     if (o == null) { 
      for (int i = 0; i < size; i++) 
       if (elementData[i]==null) 
        return i; 
     } else { 
      for (int i = 0; i < size; i++) 
       if (o.equals(elementData[i])) 
        return i; 
     } 
     return -1; 
    } 

so Ihre Filmklasse nicht vollständig in der Lage sein entwickelt damit zu arbeiten ... :)

override richtig gleich (und hashCode), damit der Code funktionieren kann!

0

Ich glaube, Sie verwenden die List#indexOf(Object) Methode falsch.

The List#indexOf(Object)

gibt den Index des ersten Auftretens des angegebenen Elements in diese Liste, oder -1, wenn diese Liste nicht enthält das Element.

Wie Sie sehen, benötigt die Methode einen Parameter, einen Object, der denselben Typ wie die Elemente in Ihrer Liste haben muss. Wenn Sie Objekte des Typs Movie speichern, müssen Sie List#indexOf(Movie) verwenden, da sie immer -1 zurückgibt, wenn Sie einen anderen Objekttyp verwenden.

Sie müssen auch sicherstellen, dass Sie kein Objekt zur Liste hinzufügen, erstellen Sie es erneut und verwenden Sie dann List#indexOf(Object).

Wenn Sie für den Index eines Movie aussehen wollen, indem sie den Namen, die nur einen for()-loop verwenden, um durch alle Objekte in der Liste zu durchlaufen und prüfen, ob der Name des Films gleich Ihren Vornamen (Groß- und Klein ignoriert). Dann gib es einfach zurück und voilà, du hast es geschafft.

// BEARBEITEN: Sie könnten natürlich auch die Methode equals() in Ihrer Movie-Klasse überschreiben.

1

Da Sie ein benutzerdefiniertes Objekt verwenden [d. H. Filme] möchten Sie möglicherweise die Methoden equals() und hashCode() überschreiben, damit die Methode indexOf() ermitteln kann, ob das angegebene Filmobjekt das gleiche ist wie ein vorhandenes Filmobjekt in Liste.

Sie diesen Artikel lesen können mehr darüber wissen: Java: howto write equals() shorter

ich empfehlen würde EqualsBuilder in Apache-Bibliothek commons-lang3

Verwandte Themen