2017-01-04 1 views
1

Ich habe derzeit ein Array mit Objekten namens "People". Jeder hat einen Namen, Tag, Monat, Jahr (der Geburt). Ich möchte diese in Datumsangaben konvertieren und die .isAfter() -Methode verwenden, um sie zu vergleichen und auf sie zurückzugreifen, aber sie werden nicht nach Datum sortiert. Hier ist eine einfachere Version des CodesIch habe ein Array von Objekten und jedem Objekt wurde ein Datum zugewiesen. Wie kann ich diese Objekte in der Reihenfolge des Datums sortieren?

for (int i = 0; i<peopleArray.size()-1; i++) 
    { 
     for (int j = 0; j<peopleArray.size()-1; j++) 
     { 

      LocalDate firstDate = LocalDate.of(Integer.parseInt(peopleArray.get(i).getDOBYear()), 
             Integer.parseInt(peopleArray.get(i).getDOBMonth()), 
             Integer.parseInt(peopleArray.get(i).getDOBDay())); 


      LocalDate secondDate= LocalDate.of(Integer.parseInt(peopleArray.get(j).getDOBYear()), 
        Integer.parseInt(peopleArray.get(j).getDOBMonth()), 
        Integer.parseInt(peopleArray.get(j).getDOBDay())); 

      if(firstDate.isAfter(secondDate)) 
      { 
       Person temp = peopleArray[i]; 
       peopleArray[i] = peopleArray[i+1]; 
       peopleArray[i+1] = temp; 
      }    
     } 
    } 

'Person' ist der Name des Objekts. Vielen Dank für Ihre Hilfe im Voraus!

+3

schreiben Vergleichbare Implementierung und übergeben Sie diese an die Collections.sort-Methode. – duffymo

+0

Dieser Beitrag kann helfen zu klären, was @duffymo bedeutet http://StackOverflow.com/Questions/5927109/Sort-Objects-in-arraylist-by-Date – Michael

Antwort

0

Wenn Ihr für eine Suche Einfachere Lösung in Java, dann sollte Lösung von user2004685 tun.

Da Sie bubble-sort getaggt haben, schätze ich, dass Sie Hilfe mit dem Problem in Ihrem Code benötigen.

Probleme:

  1. Die Schleifen werden nie in der Liste das letzte Element abzudecken. Es sollte bis i/j < size() laufen.
  2. Die Swap-Block tauscht verschiedene Elemente als die verglichenen Elemente. Sie sind Elemente an i und j Lage zu vergleichen, aber i und i+1
  3. Swapping ich den Swap-Code gehe mal davon aus, das die Array mit Index-Operator Zugriff auf eine andere Variable zu arbeiten und nicht die Listenvariable (Als Subscript ist nicht anwendbar für Liste).
  4. Sie können die Schleife verbessern, indem Sie die Dauer der Schleife reduzieren. Informationen zur Referenz finden Sie in der mitgelieferten Blasenkodierung here.

Code mit Korrektur:

for (int i = 0; i<peopleArray.size(); i++) 
{ 
    for (int j = 0; j<peopleArray.size(); j++) 
    { 
     LocalDate firstDate = LocalDate.of(Integer.parseInt(peopleArray.get(i).getDOBYear()), 
            Integer.parseInt(peopleArray.get(i).getDOBMonth()), 
            Integer.parseInt(peopleArray.get(i).getDOBDay())); 

     LocalDate secondDate= LocalDate.of(Integer.parseInt(peopleArray.get(j).getDOBYear()), 
       Integer.parseInt(peopleArray.get(j).getDOBMonth()), 
       Integer.parseInt(peopleArray.get(j).getDOBDay())); 

     if(firstDate.isAfter(secondDate)) 
     { 
      Person temp = peopleArray[i]; 
      peopleArray[i] = peopleArray[j]; 
      peopleArray[j] = temp; 
     }    
    } 
} 
0

Als duffymo vorgeschlagen, man muss nur auf People Klasse die Comparable Schnittstelle implementieren wie folgt:

public class People implements Comparable<People> { 

    /* Members */ 
    private String name; 
    private int dobDay; 
    private int dobMonth; 
    private int dobYear; 

    /* Getter, Setter, Constructor */ 

    /* Get Date Function */ 
    private Date getDate() { 
     return LocalDate.of(this.dobYear, this.dobMonth, this.dobDay); 
    } 

    @Override 
    public int compareTo(People people) { 
     return this.getDate().isAfter(people.getDate()); 
    } 
} 

Und dann schließlich das Array wie folgt sortieren:

Collections.sort(peopleArray); 
1

Als user2004685 und duffymo sagte, müssen Sie eine benutzerdefinierte compareTo, und das Beispiel user2004685 scheint mir richtig schreiben (ich habe nicht einen Compiler auf dieser Computer im Moment).

Ein Addendum, das ich vorschlagen würde, ist, dass Sie vielleicht keine People Klasse wollen - vielleicht wollen Sie nur das Array, das Sie jetzt haben, und Sie nicht immer Instanzen von Person in der Art und Weise zu sortieren möchten Sie beschreiben.Wenn ja, wird das, was zu tun passieren ein Comparator zu Arrays.sort():

Arrays.sort(people, new Comparator<Person>() { 
    public int compare(Person p1, Person p2) { 
     // implement Person.getDOB() in the appropriate way 
     return p1.getDOB().compareTo(p2.getDOB()); 
    }}); 

Oder, wenn Sie Java8 verwenden, können Sie dies tun, noch kurz und bündig mit einem Lambda:

Arrays.sort(people, (p1,p2) -> p1.getDOB().compareTo(p2.getDOB())); 
Verwandte Themen