Как воссоздать метод CompareTo в Java? - PullRequest
0 голосов
/ 20 марта 2019

Как метод compareTo() для дат работает здесь в Java?Я знаю, что при сравнении двух дат результат всегда будет 0, если он равен, 1, если сравниваемая дата внутри параметра compareTo() старше, и -1, если дата внутри параметра более поздняя.

//Just an example

String[] da = {"01/14/1975", "08/20/1975", "08/20/1975"};
SimpleDateFormat f = new SimpleDateFormat("MM/dd/yyyy");
Date d1 = new Date();
Date d2 = new Date();


//this outputs 1 because d2 is older than d1
d1 = f.parse(da[1]);            
d2 = f.parse(da[0]);     
System.out.println(d1.compareTo(d2));

//this outputs 0 because dates are the same
d1 = f.parse(da[1]);            
d2 = f.parse(da[2]);     
System.out.println(d1.compareTo(d2));

//this outputs -1 because d2 is more recent than d1
d1 = f.parse(da[0]);            
d2 = f.parse(da[1]);     
System.out.println(d1.compareTo(d2));

Теперь я хочу сравнить даты без использования метода compareTo() или какого-либо встроенного метода в Java.В максимально возможной степени я хочу использовать только базовые операторы в java.

Что такое вычисление или алгоритм метода compareTo() при сравнении дат, которые позволяют ему возвращать -1, 01?

Редактировать: В случае с примером проблемы из моей книги использование java.util.Date запрещено, предполагается, что нужно создать свой собственныйобъект даты, подобный этому:

public class DatesObj
{
    protected int day, month, year;

    public DatesObj (int mm, int dd, int yyyy) {
        month = mm;
        day = dd;        
        year = yyyy;
    }

    public int getMonth() { return month; }

    public int getDay() { return day; }

    public int getYear() { return year; }

}

Теперь, как мне сравнить это, как будто они int и определить, какой стар, а какой новее ??

Ответы [ 4 ]

2 голосов
/ 20 марта 2019

Если вы хотите сравнить две даты, как если бы они были просто старыми целыми числами, вы должны сначала превратить каждую дату в обычное старое целое число. Самый простой способ превратить год / месяц / день в представление даты в обычное старое целое число, которое можно эффективно сравнить с обычными старыми целыми числами из других дат, состоит в том, чтобы выстроить фрагменты именно в таком порядке: сначала год, следующий месяц, последний день:

//  in DateObj class....
public int getDateInt() {
    return (yyyy * 10000) + (mm * 100) + dd;
}

Итак, за 19 марта 2019 года вы получите 20190319, а за 7 декабря 1941 года вы получите 19411207; Сравнивая «целочисленные» версии дат, вы можете увидеть, что:

  • 19411207 <20190319, так же, как 7 декабря 1941 г. ранее, чем 19 марта 2019 г .; </li>
  • 20190319> 19411207, точно так же, как 19 марта 2019 г. является более поздним, чем 7 декабря 1941 г .;
  • 19411207! = 20190319, так же, как 7 декабря 1941 г. и 19 марта 2019 г. разные даты

Вы ограничены датами в рамках Common Era и не более чем через 200 000 лет в будущем с этой конкретной реализацией. Но с небольшими изменениями вы легко сможете обработать даты за пределами этих диапазонов, и я, как часто говорят учебники, оставлю это упражнение для читателя.

2 голосов
/ 20 марта 2019

Сравните годы.Если годы обеих дат совпадают, сравните месяцы.Если месяцы совпадают, сравните даты.

public int compareDate(DatesObj d) { 
    if (this.year != d.year) { 
        if (this.year > d.year)
            return 1;
        else
            return -1;
    }
    if (this.month != d.month) {
        if (this.month > d.month)
            return 1;
        else
            return -1;
    }
    if (this.day != d.day) {
        if (this.day > d.day)
            return 1;
        else
            return -1;
    }
    return 0; 
}
2 голосов
/ 20 марта 2019

Реализация Comparable и переопределение compareTo ().

class DatesObj implements Comparable<DatesObj>{
    protected int day, month, year;

    public DatesObj(int mm, int dd, int yyyy) {
        month = mm;
        day = dd;
        year = yyyy;
    }

    public int getMonth() {
        return month;
    }

    public int getDay() {
        return day;
    }

    public int getYear() { return year; }

    @Override
    public int compareTo(DatesObj o) {

        int diff = this.year - o.year;

        if(diff != 0) {
            return diff;
        }

        diff = this.month - o.month;

        if(diff != 0) {
            return diff;
        }

        return this.day - o.day;
    }

}
1 голос
/ 20 марта 2019

Ссылка: https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html

Ссылка: https://developer.android.com/reference/java/util/Calendar

создать собственный класс с Interface Comparable

class DateCompare implements Comparable<Date>
{
    protected int day, month, year;

    public DateCompare(int mm, int dd, int yyyy) {
        month = mm;
        day = dd;
        year = yyyy;
    }

    @Override
    public int compareTo(Date o) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(o);
        int diff = this.year - cal.get(Calendar.YEAR);

        if(diff != 0) {
            return diff;
        }

        diff = this.month - cal.get(Calendar.MONTH);

        if(diff != 0) {
            return diff;
        }

        return this.day - cal.get(Calendar.DAY_OF_MONTH);
    }
    public int getMonth() {
        return month;
    }

    public int getDay() {
        return day;
    }

    public int getYear() { return year; }
}

и другие полезные https://gist.github.com/Ashusolanki/fed3b6a680092985ac0ab93ed70fcd7c

private String postTime(Date date) 
{
    long postTime = date.getTime();
    long atTime = System.currentTimeMillis();

    long diff = atTime - postTime;
    long sec = TimeUnit.SECONDS.convert(diff, TimeUnit.MILLISECONDS);
    if (sec >= 60) {
        long minit = TimeUnit.MINUTES.convert(diff, TimeUnit.MILLISECONDS);
        if (minit >= 60) {
            long hours = TimeUnit.HOURS.convert(diff, TimeUnit.MILLISECONDS);

            if (hours >= 24) {
                long days = TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS);
                return days + " Days Ago";
            } else {
                return hours + " Hours Ago";
            }
        } else {
            return minit + " Minutes Ago";
        }
    } else {
        return sec + " Secounds Ago";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...