2017-10-18 103 views
-3

該清單應該以這樣的方式訂購,即該清單的日期應該接近今天的日期,如果它已經過了今天的日期日期和仍然是最近的,那麼它應該走到最後。 例如:按照最近或最近的日期先後順序獲取排序列表

日期 - 2017年3月10日2017年12月9日20/10/2017 21/10/2017

認爲這是從數據庫,檢索時的日期列表添加到自定義適配器將以相同的順序顯示列表視圖項目。 但我希望他們可以訂購(考慮到今天的日期 - 18/10/2017)

20/10/2017 21/10/2017 (即將推出日期中的前兩項結束後,現在來傳遞 日期列表)2017年3月10日2017年12月9日

下面是使用的類,

AssignmentUpload.java

public AssignmentUpload(String fileName, String url, String year, String title, 
         String instructions, AttendanceDate attendanceDate, String subjectName, String uploadedBy) { 
    this.fileName = fileName; 
    this.url = url; 
    this.year = year; 
    this.title = title; 
    this.instructions = instructions; 
    this.attendanceDate = attendanceDate; 
    this.subjectName = subjectName; 
    this.uploadedBy = uploadedBy; 
} 

public String getFileName() { 
    return fileName; 
} 

public void setFileName(String fileName) { 
    this.fileName = fileName; 
} 

public String getUrl() { 
    return url; 
} 

public void setUrl(String url) { 
    this.url = url; 
} 

public String getYear() { 
    return year; 
} 

public void setYear(String year) { 
    this.year = year; 
} 

public String getTitle() { 
    return title; 
} 

public void setTitle(String title) { 
    this.title = title; 
} 

public String getInstructions() { 
    return instructions; 
} 

public void setInstructions(String instructions) { 
    this.instructions = instructions; 
} 

public AttendanceDate getAttendanceDate() { 
    return attendanceDate; 
} 

public void setAttendanceDate(AttendanceDate attendanceDate) { 
    this.attendanceDate = attendanceDate; 
} 

public String getSubjectName() { 
    return subjectName; 
} 

public void setSubjectName(String subjectName) { 
    this.subjectName = subjectName; 
} 

public String getUploadedBy() { 
    return uploadedBy; 
} 

public void setUploadedBy(String uploadedBy) { 
    this.uploadedBy = uploadedBy; 
}} 

AttendanceDate.java用於日期

public class AttendanceDate implements Serializable{ 

private int day, month, year; 

public AttendanceDate() { 
} 

public AttendanceDate(int day, int month, int year) { 
    this.day = day; 
    this.month = month; 
    this.year = year; 
} 

public int getDay() { 
    return day; 
} 

public void setDay(int day) { 
    this.day = day; 
} 

public int getMonth() { 
    return month; 
} 

public void setMonth(int month) { 
    this.month = month; 
} 

public int getYear() { 
    return year; 
} 

public void setYear(int year) { 
    this.year = year; 
} 

@Override 
public String toString() { 
    return "AttendanceDate{" + 
      "day=" + day + 
      ", month=" + month + 
      ", year=" + year + 
      '}'; 
}} 

FacultyViewAssignmentActivity.java有loadAssignmentList()函數將被編輯

private void loadAssignmentsList() { 
    pDialog.setTitle("Searching..."); 
    pDialog.setMessage("Enjoy Assignments... :)"); 
    pDialog.show(); 
    reference.child("assignments") 
      .addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        assignmentUploadList.clear(); 
        for (DataSnapshot ps : dataSnapshot.getChildren()) { 
         for (DataSnapshot ds : ps.getChildren()) { 
          assignmentYear.setSubjectName(ds.getValue().toString()); 
          for (DataSnapshot dss : ds.getChildren()) { 
           AssignmentUpload a = dss.getValue(AssignmentUpload.class); 
           assignmentUploadList.add(a); 
          } 
         } 
        } 
        assAdapter = new FacultyViewAssignmentAdapter(FacultyViewAssignmentActivity.this, assignmentUploadList); 
        recyclerView.setAdapter(assAdapter); 
        pDialog.dismiss(); 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 
        pDialog.dismiss(); 
       } 
      }); 
} 

都堅持這個,因爲很長一段時間,任何幫助,將不勝感激。 .. 謝謝!

+0

你可以考慮訂購使用相當或比較 –

+0

您的清單,我不能,因爲最新的數據是不是在日期格式,它是簡單地分爲整數作爲INT日,月整型,詮釋一年.. ..如果你可以用比較的和比較,那麼請...但是,當我嘗試這樣做,月和日是進入升序排列,但他們的組合是越來越洗牌給我一個更好的辦法.. – Karan

+0

你能不能創建'LOCALDATE的從這些數字?它應該有工廠方法。然後你可以比較它們。沿着uploads.sort的'東西線(Comparator.comparing(upload-> createLocalDateFromAttDate(upload.getAttendanceDate())))' –

回答

-1

如果您創建兩個排序列表,一個包含即將到來的日期,另一個包含已經過去的日期,該怎麼辦?然後首先用即將到來的日期填充第三個列表,然後用過去的日期填寫。 : -

TestCode.java

package com.test; 

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Date; 
import java.util.List; 

public class TestCode { 

    public static void main(String[] args) throws ParseException { 

     SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); 
     Date today = sdf.parse("18/10/2017"); 

     // assuming Dates - 3/10/2017 12/9/2017 20/10/2017 21/10/2017 
     String dts = "3/10/2017,12/9/2017,20/10/2017,21/10/2017"; 

     List<AssignmentUpload> assignmentUploadList = new ArrayList<AssignmentUpload>(); 
     List<AssignmentUpload> futureAssg = new ArrayList<AssignmentUpload>(); 
     List<AssignmentUpload> pastAssg = new ArrayList<AssignmentUpload>(); 
     List<AssignmentUpload> finalAssg = new ArrayList<AssignmentUpload>(); 

     for (String dt : dts.split(",")) { 

      String[] nos = dt.split("/"); 
      int day = Integer.parseInt(nos[0]); 
      int mon = Integer.parseInt(nos[1]); 
      int year = Integer.parseInt(nos[2]); 

      AttendanceDate ad = new AttendanceDate(day,mon,year); 
      AssignmentUpload au = new AssignmentUpload(); 
      au.setAttendanceDate(ad); 
      au.setSubjectName("assg - " +dt); 

      assignmentUploadList.add(au); 

     } 

     // Now we will start with assignmentUploadList 

     for (AssignmentUpload au : assignmentUploadList) { 

      int day = au.getAttendanceDate().getDay(); 
      int mon = au.getAttendanceDate().getMonth(); 
      int year = au.getAttendanceDate().getYear(); 

      Date date = sdf.parse(day+"/"+mon +"/"+year); 

      if (date.before(today)) { 
       pastAssg.add(au); 
      } else { 
       futureAssg.add(au); 
      } 

     } 

     // Sort pastand future dates individually 
     Collections.sort(futureAssg); 
     Collections.sort(pastAssg,Collections.reverseOrder()); 

     // Add future Dates to final Dates first 
     finalAssg.addAll(futureAssg); 


     // Then Add past Dates to final Dates 
     finalAssg.addAll(pastAssg); 

     assignmentUploadList = finalAssg; 

     for (AssignmentUpload au : assignmentUploadList) { 
      System.out.println(au.getSubjectName()); 
     } 

    } 

} 

更新AssignmentUpload.java(使得它可比)

package com.test; 

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

import com.test.AttendanceDate; 

public class AssignmentUpload implements Comparable{ 

    private String fileName; 
    private String url; 
    private String year; 
    private String title; 

    private String instructions; 
    private AttendanceDate attendanceDate; 
    private String subjectName; 
    private String uploadedBy; 
    public String getFileName() { 
     return fileName; 
    } 
    public void setFileName(String fileName) { 
     this.fileName = fileName; 
    } 
    public String getUrl() { 
     return url; 
    } 
    public void setUrl(String url) { 
     this.url = url; 
    } 
    public String getYear() { 
     return year; 
    } 
    public void setYear(String year) { 
     this.year = year; 
    } 
    public String getTitle() { 
     return title; 
    } 
    public void setTitle(String title) { 
     this.title = title; 
    } 
    public String getInstructions() { 
     return instructions; 
    } 
    public void setInstructions(String instructions) { 
     this.instructions = instructions; 
    } 
    public AttendanceDate getAttendanceDate() { 
     return attendanceDate; 
    } 
    public void setAttendanceDate(AttendanceDate attendanceDate) { 
     this.attendanceDate = attendanceDate; 
    } 
    public String getSubjectName() { 
     return subjectName; 
    } 
    public void setSubjectName(String subjectName) { 
     this.subjectName = subjectName; 
    } 
    public String getUploadedBy() { 
     return uploadedBy; 
    } 
    public void setUploadedBy(String uploadedBy) { 
     this.uploadedBy = uploadedBy; 
    } 

    public int compareTo(Object o) { 

     AssignmentUpload au = (AssignmentUpload)o; 

     SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); 



     int day = attendanceDate.getDay(); 
     int mon = attendanceDate.getMonth(); 
     int year = attendanceDate.getYear(); 

     int oday = au.getAttendanceDate().getDay(); 
     int omon = au.getAttendanceDate().getMonth(); 
     int oyear = au.getAttendanceDate().getYear(); 

     try { 
      Date date = sdf.parse(day+"/"+mon +"/"+year); 
      Date odate = sdf.parse(oday+"/"+omon +"/"+oyear); 

      return date.compareTo(odate); 

     } catch (ParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return 0; 
    } 



} 

輸出: ASSG - 20/10/2017 ASSG - 21/10/2017 assg - 2017年3月10日 assg - 12/9/2017

+0

謝謝,現在我按照未來的順序排列我的日期,然後我添加到最終。但是,你能告訴我如何將結果更新到我的assignmentUploadList中,並同時記錄日期的相應記錄! – Karan

+0

它看起來像我能夠回答你原來的問題。你能將我的答案標記爲正確嗎?我看你的代碼很快就會回答。 – Max08

+0

是否希望AssignmentUploadList中的AssignmentUpload對象按類似於日期的順序排序? – Max08

0

比較器您需要根據需要對日期進行排序看起來是這樣的:

Comparator<LocalDate> c = (date1, date2) -> { 
       boolean isPast1 = date1.isBefore(LocalDate.now()); 
       boolean isPast2 = date2.isBefore(LocalDate.now()); 

       if (isPast1 != isPast2) 
        return isPast1 ? 1 : -1; 

       return isPast1 ? date2.compareTo(date1) : date1.compareTo(date2); 
      }); 

它按第一日期分成前,後,現在,如果在同一個組,他們是自然排序(逆轉)。

我在我的評論描述瞭如何將其應用到你的上傳:

uploads.sort(Comparator.comparing(upload -> LocalDate.of(upload.getAttendanceDate().getYear(), upload.getAttendanceDate().getMonth(), upload.getAttendanceDate().getDay()), 
      (date1, date2) -> { 
       boolean isPast1 = date1.isBefore(LocalDate.now()); 
       boolean isPast2 = date2.isBefore(LocalDate.now()); 

       if (isPast1 != isPast2) 
        return isPast1 ? 1 : -1; 

       return isPast1 ? date2.compareTo(date1) : date1.compareTo(date2); 
      })); 

有了這個,你問上傳的名單,被自己的日期使用從上面的比較器進行排序(即第一seaprating過去未來,然後訂購每個組)。