2016-06-02 4 views
1

は、私は次のように、私は学生の3つの列内のデータを持っている奇妙な問題を抱えている設定は、ソート地図を使用せずにペアでリストまたは

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 

私の目標は、最低のすべての学生のInitDAteと最高を見つけることです同じ学生のFinDate すべてのデータは文字列として格納されるので、最初に日付を解析するためにDateFormatを使って行った日付を解析する必要があります。

当初、私はStudentInitDAteおよび他のペアStudentFinDateとしてペアにデータを格納しようとした、そして私は、キーとして日付でHashMapにデータを格納しようとしたが、問題はそれだけのユニークなデータを格納しますし、 2人の生徒が同じ初期日付を持つ場合、それらのうちの1つだけがハッシュマップに格納されます。

Listを使用することに決めたので、私はSetMapsを使用してデータを保存することができないことに気付きました。

StringのタイプのリストとDateのその他の2つのリストの3つのリストが作成されているため、重複したデータを格納できます。 すべての生徒の名前を1つのリストに保存し、他の2つのリストに日付を付けました。

私が今やりたいことは、InitDAteFinDateも生徒別にソートされています。

ハッシュマップの場合のように、他のリストに基づいて1つのリストをソートする方法はありますか?

+4

をなぜあなたは '文字列NAME'が含まクラス' Student'を、作成ドント。各「学生」は、リストのinitDateとリストのfinDateを保持することができます。次に、あなたはいくつかの接続されていない 'List'のものではなく、単一のクラスですべてを実行することができます – SomeJavaGuy

+0

あなたはこの[質問](http://stackoverflow.com/questions/21678430/group-a) -list-of-object-by-an-attribute-java)を参照してください。 –

答えて

1

必要なプロパティを使って独自の学生クラスを作成し、それを学生オブジェクトのリストとして保存することを検討しましたか? 次に、生徒オブジェクトのリストを反復して、初期日付の最小値を見つけてから、もう一度繰り返して、生徒IDが見つかった最初の生徒の生徒ID 。

+0

ここで@Rawyskyesの提案をし、3つのフィールドを持つ 'Student'クラスを作り、' Comparator'を使ってソートすることができます。 – vikingsteve

0

もう1つの解決策は、学生IDがキーであり、値が日付のリストであり、注文可能な2つのMaps、InitDates、FinDatesを持つことです。

+0

'map'を使うと' keys'ではなく 'values'でソートされます –

+0

つまり、日付のリストを並べることができます。 –

0

興味のあるものがすべて最小/最大のときに日付のリストを使用するのはなぜですか?すべての生徒に対してminInitDate/maxFinDateを維持してください。ラインをスキャンするときは、ラインからの日付をこのペアの日付と比較し、必要に応じて置き換えてください。

0

実際には、リストを並べ替える必要はありません。ソートアルゴリズムの最小順序はO(n * log(n))です。次の解は、その順序がO(n)なので良いと思います。 HashMapを使用して、各学生の最小initDateと最大finDateを保持します。

メインクラス:

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()); 
     } 

    } 
} 

学生クラス:

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クラス:

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

学生名で結果をソートする必要がある場合は、 'HashMap'の代わりに' SortedMap'を使用することができます。 –

1

あなたは、リスト内のすべての学生を格納し、独自のカスタムコンパレータを記述する必要がありますmin initに基づいてソートするDate and max fin Date、以下は解決策です。

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; 
    } 

} 

これは、出力の下に与える:

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 
関連する問題