Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
2 / 2 / 2
Регистрация: 13.02.2013
Сообщений: 90

Как сделать несколько видов сортировок в коллекции?

06.05.2013, 13:13. Показов 3221. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть вот такой класс

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Composition implements Comparable<Composition> {
    
    String name;
    String janre;
    String album;
    Integer duration;
    String actor;
    Integer year;
    String songwriter;
 
    public int compareTo(Composition compareDeposit) {
 
        double compare = ((Composition) compareDeposit).getPercentRate(1, 3);
        if (this.getPercentRate(1, 3) < compare)
            return 1;
        else if (this.getPercentRate(1, 3) > compare)
            return -1;
        else
            return 0;
    }
}
тут можно не обращать внимание что внутри compareTo, это не важно в данном вопросе.

Java
1
2
3
4
5
6
7
public class MyComparator implements Comparator <Composition>{
    
    public int compare(Composition o1, Composition o2) {
        return o1.compareTo(o2);
    }
    
}
Вопрос: что можно сделать, чтоб можно было реализовать несколько видов сортировок, например по жанру, по длительности, по названию песни. У меня есть только понимание как сделать один вид сортировки, но как сделать чтоб их было несколько.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.05.2013, 13:13
Ответы с готовыми решениями:

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

Реализация различных видов сортировок
написать программу, которая реализует следующие виды сортировки: сортировка вставками, пузырьковая, Шелла, пирамедальная, слиянием и...

Как реализовать несколько сортировок ?
Добрый день. Есть некоторая таблица id|name |type|age 1 | Boris | 1 | 15 2 | Adam| 2 | 24 3 | Some| 3 | 11 4 | Vova | 6 ...

3
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
06.05.2013, 14:06
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
package comparators;
 
import java.util.Comparator;
import java.util.Objects;
import java.util.Set;
import java.util.TreeSet;
 
/**
 *
 * @author mutagen
 */
public class CompareDemo {
 
    public static void main(String[] args) {
        Set<Composition> byActor = new TreeSet<>(new ActorComparator());
        byActor.add(new Composition("q", 2013));
        byActor.add(new Composition("b", 2012));
        byActor.add(new Composition("c", 2009));
        byActor.add(new Composition("s", 2099));
        
        System.out.println(byActor);
 
        Set<Composition> byYear = new TreeSet<>(new YearComparator());
        byYear.addAll(byActor);
 
        System.out.println(byYear);
 
    }
 
    static class Composition {
 
        @Override
        public String toString() {
            return "Composition{" + "actor=" + actor + ", year=" + year + '}';
        }
 
        public Composition(String actor, Integer year) {
            this.actor = actor;
            this.year = year;
        }
 
        @Override
        public int hashCode() {
            int hash = 5;
            hash = 97 * hash + Objects.hashCode(this.actor);
            hash = 97 * hash + Objects.hashCode(this.year);
            return hash;
        }
 
        @Override
        public boolean equals(Object obj) {
            if (obj == null) {
                return false;
            }
            if (getClass() != obj.getClass()) {
                return false;
            }
            final Composition other = (Composition) obj;
            if (!Objects.equals(this.actor, other.actor)) {
                return false;
            }
            if (!Objects.equals(this.year, other.year)) {
                return false;
            }
            return true;
        }
        private String actor;
        private Integer year;
 
        public String getActor() {
            return actor;
        }
 
        public void setActor(String actor) {
            this.actor = actor;
        }
 
        public Integer getYear() {
            return year;
        }
 
        public void setYear(Integer year) {
            this.year = year;
        }
    }
 
    static class ActorComparator implements Comparator<Composition> {
 
        @Override
        public int compare(Composition o1, Composition o2) {
            return o1.getActor().compareTo(o2.getActor());
        }
    }
 
    static class YearComparator implements Comparator<Composition> {
 
        @Override
        public int compare(Composition o1, Composition o2) {
            return o1.getYear().compareTo(o2.getYear());
        }
    }
}
1
2 / 2 / 2
Регистрация: 13.02.2013
Сообщений: 90
06.05.2013, 15:07  [ТС]
благодарю) я тоже примерно так мыслил. но проблема вот в чем: в данном случае когда добавляем в коллекцию объект - то сортировка происходит автоматически. А мне необходимо сделать
Java
1
2
3
4
5
6
private List<Composition> Compositions;
    
    public void sortCompositions(){
        MyComparator comp = new MyComparator (); 
        Collections.sort(Compositions, comp);
    }
То есть мне не обязательно хранить коллекцию сразу в отсортированном виде. И еще проблема в том, что для разных реализаций приходится использовать разные коллекции, но меня это не устраивает. Мне нужно работать с одной коллекцией и для нее делать разные виды сортировки.

Добавлено через 12 минут
вообщем получается, что если реализовывать вашим способом, то список изменяется, и изменяется навсегда, а если сделать как я: накидать кучу компараторов, потом использовать .sort(), то список изменяется почему-то только на время.

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

Добавлено через 2 минуты
Цитата Сообщение от mutagen Посмотреть сообщение
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
package comparators;
 
import java.util.Comparator;
import java.util.Objects;
import java.util.Set;
import java.util.TreeSet;
 
/**
 *
 * @author mutagen
 */
public class CompareDemo {
 
    public static void main(String[] args) {
        Set<Composition> byActor = new TreeSet<>(new ActorComparator());
        byActor.add(new Composition("q", 2013));
        byActor.add(new Composition("b", 2012));
        byActor.add(new Composition("c", 2009));
        byActor.add(new Composition("s", 2099));
        
        System.out.println(byActor);
 
        Set<Composition> byYear = new TreeSet<>(new YearComparator());
        byYear.addAll(byActor);
 
        System.out.println(byYear);
 
    }
 
    static class Composition {
 
        @Override
        public String toString() {
            return "Composition{" + "actor=" + actor + ", year=" + year + '}';
        }
 
        public Composition(String actor, Integer year) {
            this.actor = actor;
            this.year = year;
        }
 
        @Override
        public int hashCode() {
            int hash = 5;
            hash = 97 * hash + Objects.hashCode(this.actor);
            hash = 97 * hash + Objects.hashCode(this.year);
            return hash;
        }
 
        @Override
        public boolean equals(Object obj) {
            if (obj == null) {
                return false;
            }
            if (getClass() != obj.getClass()) {
                return false;
            }
            final Composition other = (Composition) obj;
            if (!Objects.equals(this.actor, other.actor)) {
                return false;
            }
            if (!Objects.equals(this.year, other.year)) {
                return false;
            }
            return true;
        }
        private String actor;
        private Integer year;
 
        public String getActor() {
            return actor;
        }
 
        public void setActor(String actor) {
            this.actor = actor;
        }
 
        public Integer getYear() {
            return year;
        }
 
        public void setYear(Integer year) {
            this.year = year;
        }
    }
 
    static class ActorComparator implements Comparator<Composition> {
 
        @Override
        public int compare(Composition o1, Composition o2) {
            return o1.getActor().compareTo(o2.getActor());
        }
    }
 
    static class YearComparator implements Comparator<Composition> {
 
        @Override
        public int compare(Composition o1, Composition o2) {
            return o1.getYear().compareTo(o2.getYear());
        }
    }
}
я в джаве не сильно, и у меня есть вопрос. вы перегружали eauals и hashCode чтоб можно было сделать System.out.println(byActor);

Добавлено через 8 минут
а, все понял hashCode и equals это для сортировки потому, что по умолчанию equals будет сравнивать ссылки, а не содержимое объектов, поэтому нужно перегрузить. а hashCode это для того чтоб одинаковые по содержанию объекты отличались hash кодом
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
06.05.2013, 15:41
Цитата Сообщение от jenyakirmiza Посмотреть сообщение
вопрос. вы перегружали eauals и hashCode чтоб
http://docs.oracle.com/javase/... eeSet.html
читайте документацию, там всё есть
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.05.2013, 15:41
Помогаю со студенческими работами здесь

DataGridView RowFilter как задать несколько сортировок?
Привет, подскажите пожалуйста, я сортирую таблицу с помощью свойства RowFilter и все нормально было, но попросили переделать и сделать...

В озере водится несколько видов рыб. Три рыбака поймали рыб, представляющих некоторые из имеющихся видов
В озере водится несколько видов рыб. Три рыбака поймали рыб, представляющих некоторые из имеющихся видов. Определить: какие виды рыб есть у...

Несколько сортировок
Пишу программу, которая сортирует матрицу случайных значений пятью сортировками. Для A&gt;B Программа работает на &quot; Ура&quot;....

Сделать сортировку коллекции вместо создания новой коллекции с передачей IOrderedEnumerable<T>
Есть: SortableObservableCollection&lt;T&gt; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using...

Несколько видов одного документа
1С 8.2, Бухгалтерия. Как в конфигураторе сделать несколько видов одного документа? Пример: Приходный кассовый ордер в Бухгалтерии. В...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru