2016-10-27 3 views
-3

Ich möchte ExArrayList für eine bestimmte gpa suchen? Ich möchte eine Antwort von wahr oder falsch, wenn es in ArrayList existiert.Wie kann ich die ArrayList nach einem Artikel durchsuchen?

public class ExArrayList { 
     private String Name; 
     private double GPA; 

     public ExArrayList(String name, double gpa) { 
      this.Name = name; 
      this.GPA = gpa; 

     } 
     public void setGPA(double gpa) { 
      this.GPA = gpa; 
     } 

     public double getGPA() { 
      return GPA; 
     } 
     public void setName(String name) { 
      this.Name = name; 
     } 
     public String getName() { 
      return Name; 
     } 
     @Override 
     public String toString() { 
      return String.format("%s\t%f", this.Name, this.GPA); 
     } 
    } 

    public class Main { 
     public static void main(String[] args) { 

      ArrayList<ExArrayList> psy101 = new ArrayList<>(); 
      psy101.add(new ExArrayList("Bob", 2.9)); 
      psy101.add(new ExArrayList("Steve", 3.9)); 
      psy101.add(new ExArrayList("Charles", 4.0)); 

      System.out.println(); 
      System.out.printf("Student\tGPA\n"); 
      for(ExArrayList s : psy101) { 
       System.out.printf("%s\n", s); 

      } 

      boolean binFound = psy101.contains(2.9); // This is what I am using to search the ArrayList. It's not working. 
      System.out.println("Does the list contain GPA of 2.9? " +  binFound);` 
+2

Sortieren und dann binäre Suche –

+0

Sie müssen ['boolean equals (Objekt o)'] überschreiben (https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#) equals-java.lang.Object-) sowie ['int hashCode()'] (https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--) wenn Sie ['int indexOf (Object o)' von 'ArrayList' verwenden möchten] (http://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#indexOf-java .lang.Objekt-). – Turing85

Antwort

4

Man könnte die Liste Dampf und einen Lambda-Übereinstimmungen suchen verwenden:

boolean binFound = psy101.stream().anyMatch(g -> g.getGPA() == 2.9); 
+0

Dies funktioniert mit 'Java 8' tho –

+0

@bradimus Ihr Beispiel macht eine unnötige Auto-Box und Ihr' anyMatch() 'Argument ist kein gültiger Lambda-Ausdruck. – Andreas

0

Sie müssen eine für jede Schleife in das tun vergleichen.

if(s.getGPA == 2.9){ 
     binFound = true; 
     break; 
    } 
+0

Ich sollte hinzufügen, dass ich neu in der Programmierung bin und alle Kommentare/Einblicke geschätzt werden. – datorre

+1

Das ist nicht der richtige Weg, Doubles in 'Java' zu vergleichen. Siehe [dies] (http: // stackoverflow.com/questions/179427/how-to-resolve-a-java-rundung-double-issue) und [this] (http://stackoverflow.com/questions/8081827/how-to-compare-two-double-values -in-java) –

+1

Dieser Code wird nicht kompiliert. 's.getGPA' ist kein Feld, es ist eine Methode. – Turing85

0

Ohne Java8 Streams:

boolean binFound = false; 
for(ExArrayList exArrayList : psy101) { 
     if(exArrayList.getGPA() == 2.9) { 
      binFound = true; 
      break; 
     } 
} 
System.out.println(binFound); 

Mit Java8 Streams:

boolean binFound = psy101.stream().map(ExArrayList::getGPA). 
anyMatch(gpa -> gpa == 2.9); 
System.out.println(binFound); 
-1

Ich mag nicht jeder dieser Antworten. Die Leute haben die Präzisionsfehler vergessen, die auftreten, wenn man versucht, doubles zu vergleichen. Ich weiß, dass es für GPA-Zwecke nicht zu schlecht sein sollte, weil es nicht viel Präzision gibt. Es gibt jedoch den OK-Weg oder den richtigen Weg, Dinge zu tun. Zur Verdeutlichung siehe this und this.

Der richtige Weg zu tun, was Sie planen, ist mit binärer Suche. Aber zuerst muss die Liste sortiert werden, damit sie funktioniert.

Wie Objekte in Java zu sortieren? Sie müssen zuerst wissen, wie Sie ihre Werte vergleichen und es gibt mehrere Möglichkeiten, dies zu tun. Für mein Beispiel werde ich Comparable verwenden. Überprüfen Sie this für Lernzwecke.

verwenden Import, bevor irgendetwas

import java.util.*; 

Nun wir implement Comparable in Ihrem Objekt. Es wird nach den Änderungen wie folgt aussehen:

public class ExArrayList implements Comparable<ExArrayList> { 
    private String Name; 
    private double GPA; 

    public ExArrayList(String name, double gpa) { 
     this.Name = name; 
     this.GPA = gpa; 

    } 
    public void setGPA(double gpa) { 
     this.GPA = gpa; 
    } 

    public double getGPA() { 
     return GPA; 
    } 
    public void setName(String name) { 
     this.Name = name; 
    } 
    public String getName() { 
     return Name; 
    } 
    @Override 
    public String toString() { 
     return String.format("%s\t%f", this.Name, this.GPA); 
    } 
    //new stuff needed to compare the objects 
    public int compareTo(ExArrayList other) {     
     return Double.compare(this.GPA, other.GPA);   
    } 
} 

Jetzt können wir die Liste sortieren, indem Sie tun:

Collections.sort(psy101); 

Nachdem es sortieren, können wir den Index des Objekts suchen, indem Sie:

//here we must pass a fake object with the value that we are trying to find 
int index = Collections.binarySearch(psy101, new ExArrayList(null, 2.9)); 

System.out.println(index >= 0 ? "True" : "False"); 

index enthält die Position von 2,9 in der Liste, die 0 ist, wenn nicht gefunden, wird es eine negative Zahl enthalten.

+0

Wenn Sie einen Downvote planen, machen Sie bitte zuerst einen Kommentar –

Verwandte Themen