2016-06-02 5 views
1

ich ein seltsames Problem haben, in dem ich Daten in drei Spalten von Studenten haben wie folgtSorting Liste in Paaren ohne Karte zu verwenden oder Sets

Student InitDAte  FinDate 
    ABC 2/2/2016  5/5/2017 
    ABC 3/2/2016  3/30/2017 
    CED 1/1/2015  3/12/2017 
    LEF 1/12/2016 11/17/2017 
    CED 1/12/1999 12/23/207 
    LEF 2/13/2000 11/19/2017 

Mein Ziel ist es, die niedrigste InitDAte eines jeden Schülers zu finden und höchsten FinDate desselben Schülers. Alle Daten werden als eine Zeichenfolge gespeichert, so dass ich die Daten analysieren muss, die ich gemacht habe, DateFormat verwendend, um das Datum zuerst zu analysieren.

Anfangs habe ich versucht, Daten in einem Paar als Student, InitDAte und andere Paar Student, FinDate, Speichern und dann habe ich versucht, die Daten in einem HashMap mit Datum als Schlüssel zu speichern, aber das Problem ist es nur einzigartige Daten speichern und Wenn zwei Studenten die gleichen Anfangsdaten haben, wird nur einer von ihnen in der Hashmap gespeichert.

Ich erkannte, dass ich Set und Maps nicht verwenden kann, um Daten zu speichern, da es nur eindeutige Werte speichert, also habe ich mich dafür entschieden, List zu verwenden.

Ich habe 3 Listen erstellt, eine vom Typ String und die anderen beiden vom Typ Date, damit ich doppelte Daten speichern kann. Ich habe alle Student-Namen in einer Liste und Daten in anderen zwei Listen gespeichert.

Was ich jetzt tun möchte, ist die Liste der Schüler so zu sortieren, dass InitDAte und FinDate auch nach dem Studenten sortiert werden.

Gibt es überhaupt eine Liste auf der anderen Liste zu sortieren, wie wir es bei hashmaps tun?

+4

Warum Sie eine Klasse erstellen dont 'Student', in dem Sie ein' String name' enthalten. und jeder "Student" könnte eine "Liste initDate" und "Liste finDate" enthalten. Dann könntest du in der Lage sein, alles in einer einzigen Klasse durchzuführen, anstatt mehrere nicht verbundene 'List's. – SomeJavaGuy

+0

Du könntest eine Idee durch diese [Frage] bekommen (http://stackoverflow.com/questions/21678430/group-a -list-of-objects-by-ein-attribute-java). –

Antwort

1

Haben Sie darüber nachgedacht, Ihre eigene Schülerklasse mit den von Ihnen benötigten Eigenschaften zu schreiben und sie dann als Liste von Schülerobjekten zu speichern? Sie können dann durch die Liste der Schülerobjekte iterieren, um den niedrigsten Wert des Init-Datums zu finden, und dann erneut das höchste Fin-Datum durchlaufen, an dem die Schüler-ID der Schüler-ID Ihres ersten gefundenen Schülerobjekts entspricht .

+0

Sie können @Rawyskyes Vorschlag hier nehmen, eine 'Student' Klasse mit 3 Feldern erstellen und mit einem' Comparator' sortieren. – vikingsteve

0

Eine andere mögliche Lösung ist 2 Karten, InitDates und FinDates, wobei die Studenten IDs Schlüssel sind und die Werte sind die Listen der Daten, die bestellt werden können.

+0

mit 'map' würde nach' keys' nicht 'values' sortieren –

+0

Ich meine, die Listen der Daten können bestellt werden. –

0

Warum Listen von Daten verwenden, wenn alles, was Sie interessiert, ist min/max? Halten Sie minInitDate/maxFinDate für jeden Schüler einfach fest, und wenn Sie eine Zeile scannen, vergleichen Sie die Daten von der Zeile mit den Daten in diesem Paar und ersetzen Sie sie bei Bedarf.

0

In der Tat müssen Sie Ihre Liste nicht sortieren. Da die minimale Reihenfolge der Sortieralgorithmen O (n * log (n)) ist. Ich denke, die folgende Lösung ist besser, weil ihre Reihenfolge O (n) ist. Es verwendet eine HashMap, um Minimum InitDate und Maximum FinDate für jeden Student zu halten.

Hauptklasse:

package com.stackoverflow; 

import java.text.ParseException; 
import java.text.SimpleDateFormat; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 


public class Main { 
    public Main() { 
     super(); 
    } 

    public static void main(String[] args) throws ParseException { 
     List<Student> list = new ArrayList<Student>(); 
     SimpleDateFormat dateFormat = new SimpleDateFormat("M/d/yyyy"); 

     Student student = 
      new Student("ABC", dateFormat.parse("2/2/2016"), dateFormat.parse("5/5/2017")); 
     list.add(student); 

     student = 
       new Student("ABC", dateFormat.parse("3/2/2016"), dateFormat.parse("3/30/2017")); 
     list.add(student); 

     student = 
       new Student("CED", dateFormat.parse("1/1/2015"), dateFormat.parse("3/12/2017")); 
     list.add(student); 

     student = 
       new Student("LEF", dateFormat.parse("1/12/2016"), dateFormat.parse("11/17/2017")); 
     list.add(student); 

     student = 
       new Student("CED", dateFormat.parse("1/12/1999"), dateFormat.parse("12/23/2017")); 
     list.add(student); 

     student = 
       new Student("LEF", dateFormat.parse("2/13/2000"), dateFormat.parse("11/19/2017")); 
     list.add(student); 

     Map<String, DatePair> map = 
      new HashMap<String, DatePair>(list.size()/2); 
     for (Student st : list) { 
      DatePair datePair = map.get(st.getName()); 
      if (datePair == null) { 
       datePair = new DatePair(st.getInitDate(), st.getFinDate()); 
       map.put(st.getName(), datePair); 
      } else { 
       if (st.getInitDate().before(datePair.getInitDate())) 
        datePair.setInitDate(st.getInitDate()); 
       if (st.getFinDate().after(datePair.getFinDate())) 
        datePair.setFinDate(st.getFinDate()); 
      } 
     } 

     for (Map.Entry<String, DatePair> entry : map.entrySet()) { 
      System.out.println(entry.getKey() + ": " + entry.getValue()); 
     } 

    } 
} 

Studenten-Klasse:

package com.stackoverflow; 

import java.util.Date; 

public class Student { 
    private String name; 
    private Date initDate; 
    private Date finDate; 

    public Student() { 
     super(); 
    } 

    public Student(String name, Date initDate, Date finDate) { 
     super(); 
     this.name = name; 
     this.initDate = initDate; 
     this.finDate = finDate; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setInitDate(Date initDate) { 
     this.initDate = initDate; 
    } 

    public Date getInitDate() { 
     return initDate; 
    } 

    public void setFinDate(Date finDate) { 
     this.finDate = finDate; 
    } 

    public Date getFinDate() { 
     return finDate; 
    } 
} 

DatePair Klasse:

package com.stackoverflow; 

import java.text.SimpleDateFormat; 

import java.util.Date; 

public class DatePair { 
    private Date initDate; 
    private Date finDate; 

    public DatePair() { 
     super(); 
    } 

    public DatePair(Date initDate, Date finDate) { 
     super(); 
     this.initDate = initDate; 
     this.finDate = finDate; 
    } 

    public void setInitDate(Date initDate) { 
     this.initDate = initDate; 
    } 

    public Date getInitDate() { 
     return initDate; 
    } 

    public void setFinDate(Date finDate) { 
     this.finDate = finDate; 
    } 

    public Date getFinDate() { 
     return finDate; 
    } 

    @Override 
    public String toString() { 
     SimpleDateFormat dateFormat = new SimpleDateFormat("M/d/yyyy"); 
     return "(" + dateFormat.format(initDate) + ", " + dateFormat.format(finDate) + ")"; 
    } 
} 
+0

Wenn Sie das Ergebnis nach Schülernamen sortieren müssen, können Sie eine 'SortedMap' anstelle von' HashMap' verwenden. –

1

Sie müssen alle Schüler in einer Liste speichern und dann Ihre eigenen Vergleicher schreiben Sortierung basierend auf min init Datum und max fin Datum, Unten ist die Lösung.

public class SortStudent { 
    public static void main(String args[]){ 
     List<Student> stuList= new ArrayList<Student>(); 
     stuList.add(new Student("ABC",new Date("2/2/2016"),new Date("5/5/2017"))); 
     stuList.add(new Student("ABC",new Date("3/2/2016"),new Date("3/30/2017"))); 
     stuList.add(new Student("CED",new Date("1/1/2015"),new Date("3/12/2017"))); 
     stuList.add(new Student("CED",new Date("1/12/1999"),new Date("12/23/2017"))); 
     stuList.add(new Student("LEF",new Date("1/1/2016"),new Date("11/17/2017"))); 
     stuList.add(new Student("LEF",new Date("2/13/2000"),new Date("11/19/2017"))); 

     Set<Student> stuSet = new HashSet<Student>(stuList); 
     List<Student> stuListTemp= new ArrayList<Student>(); 



     for(Student stu : stuSet){ 
      for(Student student : stuList){ 
       if(student.equals(stu)){ 
        stuListTemp.add(student); 
       } 
      } 

      Collections.sort(stuListTemp, new findMinInitDate()); 
      System.out.println("Student Name : " + stu.getName()); 
      System.out.println("Min initDate : " + stuListTemp.get(0).getInitDate()); 
      Collections.sort(stuListTemp, new findMaxFinDate()); 
      System.out.println("Max FinDate : " + stuListTemp.get(0).getFinDate()); 
      stuListTemp.clear(); 
     } 
    } 
} 

class Student { 

    private String name; 
    private Date initDate; 
    private Date finDate; 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public Date getInitDate() { 
     return initDate; 
    } 
    public void setInitDate(Date initDate) { 
     this.initDate = initDate; 
    } 
    public Date getFinDate() { 
     return finDate; 
    } 
    public void setFinDate(Date finDate) { 
     this.finDate = finDate; 
    } 

    public Student(String name, Date initDate, Date finDate) { 
     super(); 
     this.name = name; 
     this.initDate = initDate; 
     this.finDate = finDate; 
    } 
    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((name == null) ? 0 : name.hashCode()); 
     return result; 
    } 
    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     Student other = (Student) obj; 
     if (name == null) { 
      if (other.name != null) 
       return false; 
     } else if (!name.equals(other.name)) 
      return false; 
     return true; 
    } 
    @Override 
    public String toString() { 
     return "Student [name=" + name + ", initDate=" + initDate 
       + ", finDate=" + finDate + "]"; 
    } 


} 

class findMinInitDate implements Comparator<Student>{ 

    @Override 
    public int compare(Student stu1, Student stu2) { 
     return (stu1.getInitDate().before(stu2.getInitDate()))?-1:1; 
    } 

} 

class findMaxFinDate implements Comparator<Student>{ 

    @Override 
    public int compare(Student stu1, Student stu2) { 
     return (stu1.getFinDate().before(stu2.getFinDate()))?1:-1; 
    } 

} 

Dies wird im folgenden Ausgang geben:

Student Name : ABC 
Min initDate : Tue Feb 02 00:00:00 IST 2016 
Max FinDate : Fri May 05 00:00:00 IST 2017 
Student Name : LEF 
Min initDate : Sun Feb 13 00:00:00 IST 2000 
Max FinDate : Sun Nov 19 00:00:00 IST 2017 
Student Name : CED 
Min initDate : Tue Jan 12 00:00:00 IST 1999 
Max FinDate : Sat Dec 23 00:00:00 IST 2017