41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
|
|
1 | |
Очередь с приоритетом16.03.2019, 19:31. Показов 7050. Ответов 23
Метки нет (Все метки)
Всем привет, есть задание (на картинке)
Из него сделал все, но не пойму что требуется в последнем пункте про очередь с приоритетом. Как вообще это делается, погуглил и ничего не понял.. Прикреплю архив с библиотекой к теме, буду очень благодарен за скорую помощь
0
|
16.03.2019, 19:31 | |
Ответы с готовыми решениями:
23
Очередь с приоритетом Очередь с приоритетом сделать многопоточной Сделать очередь с приоритетом, которая бы работала с классом Message<TPriority, TContent> Очередь с приоритетом. Элементы с наивысшим приоритетом ставятся в начало очереди, с наименьшим – в конец |
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
|
|
16.03.2019, 20:59 [ТС] | 3 |
Нужна помощь с пунктом
· PriorityQueue<T>: IQueue<T> where T: IComparable – класс очереди с приоритетами объектов; и если не сложно, то вкратце как и для чего это нужно UPD: чуть исправил проект с библиотекой
Сообщение от Текст задания
0
|
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
|
|
16.03.2019, 21:18 [ТС] | 4 |
Storm23, может вы шарите в этом?)
0
|
Модератор
|
|
16.03.2019, 21:32 | 5 |
Ну, судя по
PriorityQueue<T>: IQueue<T> where T: IComparable Объекты сортируются сначала по приоритету, потом по очерёдности поступления. Но мне не понятно базовое наследование IStack<T>: IEnumerable<T> и IQueue<T>: IEnumerable<T> . Одни из основных методов для Стека и Очереди это Метод добавления в них новых элементов и Метод получения очередного элемента с его удалением.Но IEnumerable не поддерживает изменение последовательности. Или я чего-то не понимаю. Или это крайне неудачный выбор для базовых интерфейсов.
1
|
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
|
|
16.03.2019, 22:47 [ТС] | 6 |
Элд Хасп, рад бы и рассказать как и зачем, но я сам не знаю) Такое вот задание.. Я вообще не любитель выполнять бесполезные задачи для универа и самому реализовывать велосипед, когда люди уже давно все сделали.
0
|
Администратор
|
|
16.03.2019, 23:16 | 7 |
Элд Хасп, IEnumerable для очередей вполне подходит. Для возможности перебрать содержимое коллекции без модификации. Стандартные коллекции Queue<T>, Stack<T> их тоже реализуют.
2
|
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
|
|
17.03.2019, 08:01 [ТС] | 8 |
Может кто-то накидать пример? Не очень понимаю как работать вообще с where T: IComparable
0
|
Модератор
|
|||||||||||
17.03.2019, 10:28 | 9 | ||||||||||
По идее, должно быть что-то подобное.
Если я правильно понял, то раз класс реализовывает два интерфейса, то сначала надо сравнить объекты между собой, а потом в порядке их поступления. Добавление, объектов происходит в начало последовательности. Вывод из конца последовательности. Если так, то:
IQueue<T>: IEnumerable<T> – базовый интерфейс для всех очередей; Добавлено через 28 минут Для реализации удаления элемента из очереди, наверное, надо предусмотреть в базовом интерфейсе IQueue<T> метод удаления из очереди произвольного элемента Remove(T). Добавлено через 1 час 16 минут Ошибочка
1
|
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
|
|
17.03.2019, 15:21 [ТС] | 10 |
Элд Хасп, моя реализация в архиве прикреплена под 2 сообщением. Больше ничего не менял
0
|
Модератор
|
|||||||||||
17.03.2019, 17:42 | 11 | ||||||||||
Блин! Код в теме выставляйте - у Вас же не мега проект!
Я пишу с телефона, чтобы Ваш проект открыть это так поизвращаться пришлось! Если правильно понял Ваш код, то вот пример реализации. Могут быть мелкие ошибки - всё таки с телефона пишу.
На счёт 14 строчки не уверен. Может быть достаточно:
1
|
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
|
|
17.03.2019, 23:23 [ТС] | 12 |
Элд Хасп, буду знать) Извините) Спасибо, завтра попробую, отпищусь
0
|
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
|
||||||
18.03.2019, 17:38 [ТС] | 13 | |||||
Элд Хасп, а можно вопрос?) Как это собственно должно работать? Не особо уловил суть "приоритетов"
Добавлено через 1 минуту Элд Хасп, Peek в случает int сортирует по возрастанию перед возвратом элемента. Странно, что GetEnumerator так не делает.. я вывожу очередь вот так
0
|
Модератор
|
|
18.03.2019, 17:44 | 14 |
Так как по условию задачи
IQueue<T> where T: IComparable , то приоритет определяется интерфейсом IComparable. Для числовых типов и string IComparable дефолтный (но можно переопределить), для кастомных типов надо явно реализовывать интерфейс.По алгоритму, весь список сортируется от меньшего к большему значению - это и есть сортировка в порядке приоритета. Элементы с одинаковым приоритетом будут расположены в порядке их записи в очередь: новые ближе к началу, старые - к концу. Получается, что последний элемент списка (после сортировки по приоритету) имеет самый большой приоритет и он записан раньше всех с этим же приоритетом.
1
|
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
|
|
18.03.2019, 17:46 [ТС] | 15 |
Элд Хасп, да я про это все читал. Просто не понятно, сам список выводится без сортировки, однако Peek отрабатывает верно
0
|
Модератор
|
||||||
18.03.2019, 17:54 | 16 | |||||
Это потому, что переопределён GetEnumerator - 17 строка.
Сам же List не должен сортироваться, так как фактически индексы элементов в нём используются для определения очерёдности среди элементов с одинаковым приоритетом. Так как по условию задачи IQueue<T>: IEnumerable<T>, то чтобы получить всю очередь надо использовать приведение foreach (var tmp in (IEnumerable)PriorityQueue). Также Вы неверно используете listBox. Вывод в ListBox списка делается так (два варианта):
1
|
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
|
|
18.03.2019, 17:56 [ТС] | 17 |
Элд Хасп, спасибо огромное)
0
|
Модератор
|
|
18.03.2019, 17:59 | 18 |
PriorityQueue создан как наследник List<T>. У листа есть индексы, которые не трогаются и иду в порядке записи элементов. Элементы записанные раньше имеют более высокий индекс. Самый новый элемент имеет индекс 0.
Так же List<T> имеет интерфейс Ienumerable через который по условию задачи и должны работать методы с очередью. В этом интерфейсе переопределён метод GetEnumerator, поэтому Peek возвращает не последний по индексу элемент, а самый больший из элементов, если их несколько, то с самым большим индексом из них.
1
|
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
|
||||||
18.03.2019, 18:01 [ТС] | 19 | |||||
Элд Хасп, странно кстати, но это не работает. Точнее работает, но не обновляется при изменении PriorityQueue. Хотя вроде должно, на сколько я понимаю. Даже если написать это под кнопкой и кликнуть дважды, то новые элементы не появятся (будет только то, что было при первом клике)
0
|
Alvin Seville
|
|
18.03.2019, 18:04 | 20 |
Объявили тип обобщённой очереди с элементами типа T, где T - это тип, который можно сравнивать (через .CompareTo).
1
|
18.03.2019, 18:04 | |
Помогаю со студенческими работами здесь
20
Очередь с приоритетом Очередь с приоритетом Очередь с приоритетом Очередь с приоритетом Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |