Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 23.02.2012, 22:23
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 1  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
По умолчанию Как отсортировать Vector

Здравствуйте. Мне нужно отсортировать, например, вектор Vector.<SomeObject> по полю prop:uint каждого элемента. То есть проверить каждый элемент вектора и узнать его prop (чем выше prop - тем выше индекс элемента). В справке нет ни одного примера как это сделать. В гугле тоже нет (только информация как сортировать вектор не стандартным sort()). Нашел простой код:
Код AS3:
public function initTurn():void {
	var test:Vector.<int> = new <int>[3,5,2,3,9,0,1,8];
	test.sort(compare);
	for (var i:uint = 0; i < test.length; i++) {
		trace(test[i]);
	}
	// выводит 0,1,2,3,3,5,8,9
}
 
private function compare(x:int, y:int):Number {
	if (x > y) {
		return 1;
	} else if (x < y) {
		return -1;
	} else {
		return 0;
	}
}
Захотел в нем разобраться и переделать под свой случай. Но, как говорится: "смотрю в книгу - вижу фигу". Что это за x и y, откуда они берутся, почему при вызове test.sort(compare) - не передаются никакие параметры, кто получает Number, возвращаемый функцией compare, и что оно с ним делает?
Пожалуйста, подскажите код для сортировки вектора с пользовательским типом (не int, Number, uint). Или, хотя бы, подскажите что за колдовство происходит при вызове этой строчки:
Код AS3:
test.sort(compare);
, может дальше как-нибудь сам разберусь.
__________________
Я мало чего умею, но зато хорошо умею учиться...

Старый 23.02.2012, 22:27
СлаваRa вне форума Посмотреть профиль Отправить личное сообщение для СлаваRa Найти все сообщения от СлаваRa
  № 2  
Ответить с цитированием
СлаваRa
 
Аватар для СлаваRa

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
общий смысл вкратце:
Код AS3:
var elements:Vector.<int> = new <int>[3,5,2,3,9,0,1,8];
private function compare(element1:int, element2:int):int {
	if (element1 > element2)
		return 1;
	if (element1 < element2)
		return -1;
	return 0;
}
__________________
местонахождение

Старый 23.02.2012, 22:35
СлаваRa вне форума Посмотреть профиль Отправить личное сообщение для СлаваRa Найти все сообщения от СлаваRa
  № 3  
Ответить с цитированием
СлаваRa
 
Аватар для СлаваRa

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
Причем тут массив? Метод сортировки у Vector свой.
Описание параметров, которые он принимает:
Цитата:
Параметры

compareFunction:Function — Метод сравнения, определяющий поведение при сортировке.
Указанный метод должен взять два аргумента базового типа (T) вектора и возвратить число:

function compare(x:T, y:T):Number {}
Логика функции compareFunction такова, что при наличии двух элементов x и y функция возвращает одно из следующих трех значений:

отрицательное число, если x стоит перед y после сортировки;
0, если x равно y;
положительное число, если элемент x должен следовать за y в отсортированной последовательности.
__________________
местонахождение

Старый 23.02.2012, 22:35
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 4  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
СлаваRa, спасибо, теперь понял: x и y - это просто перебираемые элементы вектора . В таком случае вот как надо:
Код AS3:
var test:Vector.<SomeObject> = new <SomeObject>[obj1, obj2, obj3];
test.sort(compare);
 
private function compare(element1:SomeObject, element2:SomeObject):Number {
	if (element1.prop > element2.prop ) {
		return 1;
	} else if (element1.prop < element2.prop) {
		return -1;
	} else {
		return 0;
	}
}
__________________
Я мало чего умею, но зато хорошо умею учиться...

Старый 23.02.2012, 22:37
СлаваRa вне форума Посмотреть профиль Отправить личное сообщение для СлаваRa Найти все сообщения от СлаваRa
  № 5  
Ответить с цитированием
СлаваRa
 
Аватар для СлаваRa

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
ну да, так и есть
__________________
местонахождение

Старый 23.02.2012, 22:41
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 6  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Вот я не хороший человек!!! Только сейчас увидел про функцию сравнения в справке . Читал когда-то давно и то ли не понял, то ли не дочитал. А сейчас - вместо того чтобы еще раз посмотреть - начал искать черную кошку в темной комнате, которой в этой комнате нет...
__________________
Я мало чего умею, но зато хорошо умею учиться...

Старый 24.02.2012, 01:28
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 7  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Что смешно, так это то, что этот пример - бездумная копия из мануала, на самом деле не нужно возвращать строго -1, 0 или 1, достаточно просто возвращать положительное, отрицательное и 0. Т.е. функция сортировки может выглядеть так:

Код AS3:
private function sortHelper(x:int, y:int):int
{
	return x - y;
}
Да, с поправкой на то, что если вы предвидите ситуацию, когда будет переполнение, например, если отнять 1 от int.MIN_VALUE, то, возможно, есть смысл нормализовать значения, например так:

Код:
1 / (1 / y - 1 / x)
Но если такие случаи не предвидятся, то это будет лишним.
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 24.02.2012 в 01:35.
Старый 24.02.2012, 03:15
fljot вне форума Посмотреть профиль Отправить личное сообщение для fljot Найти все сообщения от fljot
  № 8  
Ответить с цитированием
fljot

блогер
Регистрация: Jul 2007
Сообщений: 940
Записей в блоге: 3
Цитата:
Сообщение от wvxvw Посмотреть сообщение
на самом деле не нужно возвращать строго -1, 0 или 1, достаточно просто возвращать положительное, отрицательное и 0.
А это советую перепроверить. Помню, был как-то очень удивлён, что сортировка работала неправильно — оказалось надо именно -1, 0, 1, хотя в документации было сказано про положительные и отрицательные в общем.

Старый 24.02.2012, 04:16
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 9  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Я проверил - у меня работает

В конце концов, если так уж прям замуж невтерпеж, то
Код AS3:
private function sortHelper(x:int, y:int):int
{
	var result:int = x - y;
	return Math.abs(result) / result;
}
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 24.02.2012 в 04:20.
Старый 24.02.2012, 14:00
Dima_DPE вне форума Посмотреть профиль Отправить личное сообщение для Dima_DPE Найти все сообщения от Dima_DPE
  № 10  
Ответить с цитированием
Dima_DPE

блогер
Регистрация: Aug 2005
Сообщений: 178
Записей в блоге: 4
Цитата:
Сообщение от wvxvw Посмотреть сообщение
В конце концов, если так уж прям замуж невтерпеж, то
Код AS3:
private function sortHelper(x:int, y:int):int
{
	var result:int = x - y;
	return Math.abs(result) / result;
}
Очень опасный вариант, при равных x и y, result будет равен 0, а всем известно что 0/0=NaN, и вот тут спасает только приведение к int, т.к. int(NaN)=0. Но все это очень опасно, я бы так не делал.

Создать новую тему Ответ Часовой пояс GMT +4, время: 15:16.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
sorting , Vector
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 15:16.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.