【问题标题】:cannot seem to sort an Array of objects by date似乎无法按日期对对象数组进行排序
【发布时间】:2018-08-14 02:44:38
【问题描述】:
class newPlanner{

    private  newAppointment[] Appoint = new newAppointment[20];

    newPlanner(){
        newAppointment obj1 = new newAppointment("Mar",4,17,30,"Quiz 1");

        newAppointment obj2 = new newAppointment("Apr",1,17,30,"Midterm");

        newAppointment obj3 = new newAppointment("May",6,17,30,"Quiz 2");

        newAppointment obj4 = new newAppointment("Jun",3,17,30,"Final");

        Appoint [0] = obj4;
        Appoint [1] = obj3;
        Appoint [2] = obj2;
        Appoint [3] = obj1;

    }

    public void runMethod(){
        boolean answer = true;

        while (answer) {
            System.out.println("Select an Option. ");
            System.out.println(" 1. Add Appointment ");  
            System.out.println(" 2. List Appointment ");
            System.out.println(" 3. Delete Appointment ");
            System.out.println(" 4. Exit ");

这是我的代码,我需要创建一个方法来移动数组元素以插入新约会并删除约会。该数组需要按日期排序,我似乎无法得到它请帮助

【问题讨论】:

  • 这是什么语言?爪哇?不要使用数组,使用List,然后对其进行Collections.sort。
  • 是的 java 我会,但我们必须明确使用数组
  • 如果您最终确实需要一个数组,请使用List.toArray 将其转换回来。这看起来像是某种学术编码问题,在现实世界中,没有人会为这种事情使用数组,这就是发明集合 API 的目的。

标签: java arrays object methods


【解决方案1】:

您可以使用Arrays.sort(T[] a,Comparator<? super T> c) 对数组进行就地排序,其中T 是您的Appointment 类。

您需要为Appointment 实现Comparator 接口。如果您的 Appointment 类在构造函数中使用 Date 对象,这将容易得多;那么你的比较器就是:

Arrays.sort(appointments, new Comparator<Appointment>{

    @Override
    public int compare(Appointment appointment1, Appointment appointment2){
        return appointment1.getDate().compareTo(appointment2.getDate());
    }
});

您可以按如下方式确定Appointment 上课的日期:

public class Appointment{
    /**
    * three letter month
    */
    private final String month;

    /**
    * one to two digit day e.g. 1 or 12,
    */
    private final int day;

    /**
    * two digit military time hour e.g. 01, 11, 17
    */
    private final int hour;

    /**
    * lazily instantiated appointment Date
    */
    private Date date;

    //..

    public class Appointment(String month, int day, int hour /*other parameters*/){
        this.month = month;
        this.day = day;
        this.hour = hour;

        calculateDate();
    }

    private void caculateDate(){
        String dateString = String.format("%d %s 2018 %d",day,month,hour);
        SimpleDateFormat dateFormat = new SimpleDateFormat("d MMM yyyy HH");

        try{
            this.date = dateFormat.parse(dateString);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    public Date getDate(){
        return date;
    }
}

【讨论】:

  • 其中一个约会类采用构造函数,但格式为月、日、小时、描述
  • 您需要将其转换为日期。为此,您可以创建一个日期字符串,然后使用SimpleDateFormat 对其进行解析。例如您可以创建一个字符串 4 Mar 2018 17 并使用格式 d MMM yyyy HH 解析它
  • 对不起,我没有正确解释它的字符串月份,int day,int hour int min string description
  • 是的,我明白了。您可以将这些值转换为日期。首先,创建一个日期字符串,例如String.format("%d %s 2018 %d",day,month,hour);。然后使用SimpleDateFormat 将此字符串转换为日期
  • String a = Integer.toString(day);字符串 b = Integer.toString(hour);字符串 c = Integer.toString(min);字符串 abc = 月 +a+b+c;日期日期 = new SimpleDateFormat("MMM","dd","hh","mm").parse(abc);日历 cal = Calendar.getInstance(); cal.setTime(日期); cal.get(Calendar.MONTH);
【解决方案2】:

将 ArrayList 用于AppPoint。编写您自己的自定义比较器。使用Collections.sort(appPoint, new &lt;CustomComparator&gt;())

【讨论】:

    【解决方案3】:
    public boolean compareAppointment (newAppointment A1, newAppointment A2) {
    
        String [] validMonth = {"JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL",
                                "AUG", "SEP", "OCT","NOV","DEC"};
    
        int a=0;
        int b=0;
    
        for ( int i = 0; i< validMonth.length; i++) {
          if (A1.getMonth() == null ? validMonth[i] == null : A1.getMonth().equals(validMonth[i])) {
            a=i;
          }
    
          if (A2.getMonth() == null ? validMonth[i] == null : A2.getMonth().equals(validMonth[i])) {
            b = i;
          }
        }
    
        if (a!=b) {
          return a < b;
        }
    
        if (A1.getDay() != A2.getDay()) {
          return A1.getDay() < A2.getDay();
        }
    
        if (A1.getHourr()!= A2.getHourr()) {
          return A1.getHourr() < A2.getHourr();
        }
    
        if (A1.getMinn() != A2.getMinn()) {
          return A1.getMinn() < A2.getMinn();
        }
    
        return false;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 2011-10-30
      • 2015-02-25
      • 2013-10-26
      相关资源
      最近更新 更多