Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/78: Рейтинг темы: голосов - 78, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 14

Сортировка массива объектов по дате

12.09.2013, 01:03. Показов 16536. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую еще раз!

Как сделать сортировку массива объектов по полю Дата ( Calendar ) ?
Одномерный массив состоит из объектов.
Объект состоит из: (имя, цена, скидка, дата);

дата заливается так:
Java
1
2
this.calendar = Calendar.getInstance();
this.calendar.set(dateYear, dateMouth, dateDay);
есть метод
Java
1
2
3
    public Calendar getCalendar() {
        return calendar;
    }
Можно по этому методу обратиться из массива к дате и отсортировать массив по дате через встроенные библиотеки? типа sort() (или хотя бы получить последовательность Mass[i] по которым просто выводить каждый элемент массива)
Или как поступить вообще?

Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.09.2013, 01:03
Ответы с готовыми решениями:

Сортировка массива объектов по дате
Подскажите, что неправильно!!! Не сортируются объекты по дате. Просто в объектах меняются даты по возрастанию!:scratch: class...

Сортировка объектов из ArrayList по дате
Помогите сделать сортировку по дате. В гугле находил несколько вариантов пытался применить их но меня всякими эксепшенами засыпает. ...

Сортировка объектов по дате
Здравствуйте. Есть объекты, у которых есть свойство DateTime. Создается массив из этих объектов (произвольной длинны, обычно до 100), нужно...

16
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
12.09.2013, 10:29
Реализуйте интерфейс Comparable<ИмяВашегоКласса>, и добавьте метод compareTo(). Не забудьте, что метод
compareTo() должен сравнить все значащие поля. Реализация, например, такая:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import java.text.SimpleDateFormat;
 
class MyClass implements Comparable<MyClass> { 
    private String name;
    private double price;
    private double discount;
    private Calendar date;
    
    public MyClass(String name, double price, double discount, Calendar date) {
        this.name = name;
        this.price = price;
        this.discount = discount;
        this.date = date;
    }
        
    @Override
    public int compareTo(MyClass that) {
        int dtCompare = this.date.compareTo(that.date);
        if (dtCompare != 0) 
            return dtCompare;
        
        int nameCompare = this.name.compareTo(that.name);
        if (nameCompare != 0) 
            return nameCompare;
        
        int priceCompare = Double.compare(this.price, that.price);
        if (priceCompare != 0) 
            return priceCompare;
        
        return Double.compare(this.discount, that.discount);
    }
    
    @Override
    public String toString() {
        return name + ", " + price + ", " + discount + ", " + 
               new SimpleDateFormat("dd.MM.yyyy").format(date.getTime());
    }
}
 
class Tester {
    public static void main(String[] args) {
        Calendar dt1 = Calendar.getInstance();
        dt1.set(2013, Calendar.JUNE, 8);
 
        Calendar dt2 = Calendar.getInstance();
        dt2.set(2013, Calendar.JUNE, 1);
 
        MyClass a = new MyClass("a", 100., 0., dt1);
        MyClass b = new MyClass("b", 100., 0., dt2);   
        MyClass[] arr = new MyClass[2];
        
        arr[0] = a;
        arr[1] = b;
        
        Arrays.sort(arr);
        System.out.println(arr[0]);
        System.out.println(arr[1]);
    }
}
Можете почитать мой конспект главы из Bloch - Effective Java на тему Comparable: https://github.com/Suobig/Effe... rable.java
1
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 14
12.09.2013, 13:28  [ТС]
Спасибо. Помогло сильно.
А вот если у нас есть вариант выбора сортировки по дате или по цене (т.е. не один столбец, а несколько и не сразу, а на выбор) с тем же условием, что выше. Сразу я понял как сортировать несколько столбцов.
Т.к. только в родном классе можно создавать:

Java
1
2
@Override
    public int compareTo(Object object) {
Есть ли возможность создать 2 разных сортировки?
Пока на уме только создать класс-наследник с @Override и по этому оверрайду обращаться к родителю.
Пока не попробовал, но как вариант походу должно сработать.
Вопрос....если заработает - будет ли это правильный подход?
И есть ли подобные варианты создания 2 различных сортировок?
0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
12.09.2013, 13:47
Нет, так делать не надо. Надо использовать другой Arrays.sort(), в который помимо массива передается еще экземпляр класса, который реализует интерфейс Comparator.
0
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 14
12.09.2013, 14:16  [ТС]
т.е. по сути надо делать класс-копию с такими же параметрами? Если да, а не плохо ли это для памяти?
Или я не так понял?
0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
12.09.2013, 14:52
Цитата Сообщение от White bear Посмотреть сообщение
т.е. по сути надо делать класс-копию с такими же параметрами? Если да, а не плохо ли это для памяти?
Или я не так понял?
Нет. Создается отдельный класс, который реализует интерфейс Comarator. Его единственная функция - получить два экземпляра класса и вернуть отрицательное число, ноль или положительное число, если первый экземпляр, соответственно, меньше, равен или больше второго.

Добавлено через 30 минут
Пример:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
class MyClass implements Comparable<MyClass> { 
    private String name;
    private double price;
    private double discount;
    private Calendar date;
    
    public String getName() {
        return name;
    }
    
    public double getPrice() {
        return price;
    }
    
    public double getDiscount() {
        return discount;
    }
    
    public Calendar getDate() {
        return date;
    }
    
    public MyClass(String name, double price, double discount, Calendar date) {
        this.name = name;
        this.price = price;
        this.discount = discount;
        this.date = date;
    }
        
    @Override
    public int compareTo(MyClass that) {
        int dtCompare = this.date.compareTo(that.date);
        if (dtCompare != 0) 
            return dtCompare;
        
        int nameCompare = this.name.compareTo(that.name);
        if (nameCompare != 0) 
            return nameCompare;
        
        int priceCompare = Double.compare(this.price, that.price);
        if (priceCompare != 0) 
            return priceCompare;
        
        return Double.compare(this.discount, that.discount);
    }
    
    @Override
    public String toString() {
        return name + ", " + price + ", " + discount + ", " + 
               new SimpleDateFormat("dd.MM.yyyy").format(date.getTime());
    }
}
 
class Tester {
    public static void main(String[] args) {
        Calendar dt1 = Calendar.getInstance();
        dt1.set(2013, Calendar.JUNE, 8);
 
        Calendar dt2 = Calendar.getInstance();
        dt2.set(2013, Calendar.JUNE, 1);
 
        MyClass a = new MyClass("a", 100., 0., dt1);
        MyClass b = new MyClass("b", 200., 0., dt2);   
        MyClass c = new MyClass("c", 50., 0., dt2);   
        MyClass[] arr = new MyClass[3];
        
               
        arr[0] = a;
        arr[1] = b;
        arr[2] = c;
        
        MyClassComparator comparator = new MyClassComparator();
        comparator.setCompareMethod(MyClassCompareMethods.BY_NAME);
        
        Arrays.sort(arr, comparator);
        System.out.println("Compare by Name:");
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        
        comparator.setCompareMethod(MyClassCompareMethods.BY_DATE);
        
        Arrays.sort(arr, comparator);
        System.out.println("Compare by Date:");
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        
        
        comparator.setCompareMethod(MyClassCompareMethods.BY_PRICE);
        
        Arrays.sort(arr, comparator);
        System.out.println("Compare by Price:");
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
    }
}
 
enum MyClassCompareMethods {
    BY_NAME,
    BY_PRICE,
    BY_DISCOUNT,
    BY_DATE;
}
 
class MyClassComparator implements Comparator<MyClass> {
    private MyClassCompareMethods compareMethod;
    
    public void setCompareMethod(MyClassCompareMethods method) {
        compareMethod = method;
    }
    
    @Override
    public int compare(MyClass o1, MyClass o2) {
        switch (compareMethod) {
            case BY_NAME:
                int nameDiff = o1.getName().compareTo(o2.getName());
                if (nameDiff != 0) 
                    return nameDiff;
                break;
            case BY_PRICE: 
                int priceDiff = Double.compare(o1.getPrice(), o2.getPrice());
                if (priceDiff != 0) 
                    return priceDiff;
                break;
            case BY_DISCOUNT:
                int discountDiff = Double.compare(
                        o1.getDiscount(), o2.getDiscount());
                if (discountDiff != 0) 
                    return discountDiff;
            case BY_DATE:
                int dateDiff = o1.getDate().compareTo(o2.getDate());
        }
        //Если приоритетное сравнение вернуло 0 - сравниваем по умолчанию
        return o1.compareTo(o2);
    }    
}
1
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 14
12.09.2013, 16:38  [ТС]
Ура! Все работает... спасибо большое
Вот еще глупый вопрос
Java
1
2
3
int priceCompare = Double.compare(this.price, that.price);
        if (priceCompare != 0) 
            return priceCompare;
У меня прайс в int. Я вместо Double ставлю Integer. Все запускается. Но и на Double все выводится как int нормально.
Правильно ли я поступаю, меняя Double на Integer для полей int ?
0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
12.09.2013, 16:46
Цитата Сообщение от White bear Посмотреть сообщение
Правильно ли я поступаю, меняя Double на Integer для полей int ?
Ну да. Скорее всего, там происходит неявное преобразование int в double для сравнения. Но лучше все-таки Integer сравнивать как Integer
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
12.09.2013, 18:56
Цитата Сообщение от White bear Посмотреть сообщение
Правильно ли я поступаю, меняя Double на Integer для полей int ?
Вопрос на засыпку. Какие границы значений у double и какие у int?

Java
1
2
3
4
double d = 2147483650d;
int i = (int)d;
System.out.println("d="+d);
System.out.println("i="+i);
0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
12.09.2013, 19:02
Цитата Сообщение от Skipy Посмотреть сообщение
Вопрос на засыпку. Какие границы значений у double и какие у int?
Он про то, можно ли через Double.compare() сравнивать два целых числа. Вроде не должно быть проблем. Там через ">", "<", без вычитаний все делается. Я было подумал, что если ">", "<" не даст результата, то могут быть какие-то специфические для double проверки, которые на int улетят в Exception, но вроде все нормально, 0 возвращает.
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
13.09.2013, 01:03
Цитата Сообщение от Gibby Посмотреть сообщение
Он про то, можно ли через Double.compare() сравнивать два целых числа. Вроде не должно быть проблем
если сравнивать 2 int значения, например 3, то они могут быть не равны при касте в double, так как могут появляться 3.0000000001 всякие десятичные знаки
0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
13.09.2013, 01:14
Цитата Сообщение от mutagen Посмотреть сообщение
если сравнивать 2 int значения, например 3, то они могут быть не равны при касте в double, так как могут появляться 3.0000000001 всякие десятичные знаки
Вряд ли проблема возникнет в таком виде - я так понимаю, там вполне однозначное преобразование. Т.е. биты в память в обоих случаях запишутся одинаковые. А вот если double a = 3.; сравить с int b = 3; - то тут возможны всякие чудеса
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
13.09.2013, 02:24
хоть это и говнокодинг, но следует признать что проблем таки нет на касте, главное не вычислять ничего )
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 * @author mutagen
 */
public class WrongComparation {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int trueAccumulator = 0;
        int falseAccumulator = 0;
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            int c = (compare(i, i)) ? trueAccumulator++ : falseAccumulator++;
        }
        System.out.println("false " + falseAccumulator);
        System.out.println("true " + trueAccumulator);
    }
 
    static boolean compare(double a, double b) {
        return (Double.compare(a, b) == 0); 
    }
}
Bash
1
2
3
4
run:
false 0
true 2147483647
BUILD SUCCESSFUL (total time: 7 seconds)
0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
13.09.2013, 02:46
Цитата Сообщение от mutagen Посмотреть сообщение
следует признать что проблем таки нет на касте
Сравни теплое с мягким double с int. Интересно же
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
13.09.2013, 10:04
Цитата Сообщение от mutagen Посмотреть сообщение
если сравнивать 2 int значения, например 3, то они могут быть не равны при касте в double, так как могут появляться 3.0000000001 всякие десятичные знаки
Откуда бы? Любое целое число представимо в виде конечного двоичного. Это с дробными проблемы начинаются. Переполнения точности тоже не будет - у double на мантиссу больше 32 бит отведено.
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
13.09.2013, 10:29
Цитата Сообщение от Skipy Посмотреть сообщение
Откуда бы?
неоткуда ), сработала привычка что после операций с даблами у них "плывёт" значение в последних цифрах после запятой
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
13.09.2013, 11:34
Цитата Сообщение от mutagen Посмотреть сообщение
неоткуда ), сработала привычка что после операций с даблами у них "плывёт" значение в последних цифрах после запятой
Да, привычки это сила. Я чуть не написал про потерю точности при преобразовании int к double. Потом только включился и вспомнил длину мантиссы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.09.2013, 11:34
Помогаю со студенческими работами здесь

Сортировка ассоциативного массива по дате
Здравствуйте! Не могу отсортировать массив по дате, так как она в виде строки. Двумерный массив типа: Array( =&gt; Array( =&gt;...

Сортировка массива объектов
Мне нужно отсортировать массив объектов по значению одного из полей этих объектов (string), как это можно реализовать?

Сортировка массива объектов
У меня есть сортировка массива объектов: Arrays.sort(people, new Comparator&lt;people&gt; () { public int compare(people a,...

Сортировка массива объектов
Доброго времени суток. Есть массив объектов: var mas = ; Как видно из примера внутри каждого объекта есть поля from и to. Нужно...

Сортировка массива объектов
Доброго всем времени суток. Суть проблемы такова: необходимо отсортировать массив объектов по определённому свойству одного объекта. Сам...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru