2017-10-18 129 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过去未来,然后订购每个组)。