Большая реализация метода CompareTo(T)
От: corpse56  
Дата: 23.06.09 14:25
Оценка:
Здравствуйте. не знаю в какой форум.
если реализация этого метода занимает более 20-и if'ов — это нормально?
просто условие сортировки такое... это сильно повлияет на производительность при объеме до 500 элементов?
что еще можно применить кроме реализации IComparble<T> для такого длинного условия ?
спасибо.
Re: Большая реализация метода CompareTo(T)
От: Пельмешко Россия blog
Дата: 23.06.09 14:45
Оценка:
Здравствуйте, corpse56, Вы писали:
C>если реализация этого метода занимает более 20-и if'ов — это нормально?
Вы не стесняйтесь, приведите эту реализацию, а тут уже подскажут нормально или нет

C>просто условие сортировки такое... это сильно повлияет на производительность при объеме до 500 элементов?

Все экстрасенсы на ТНТ...

C>что еще можно применить кроме реализации IComparble<T> для такого длинного условия ?

Чуть-чуть быстрее сортировки с использованием IComparable<T> будет использование делегата Comparator, если метод сортировки позволяет, конечно (насколько помню, вызов делегата в простейшем случае чуть быстрее вызова члена интерфейса, но при 500 элементах это всё такие мелочи, что Вы никогда не заметите разницы).
Re[2]: Большая реализация метода CompareTo(T)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 23.06.09 22:36
Оценка: +1
Здравствуйте, Пельмешко, Вы писали:

П>насколько помню, вызов делегата в простейшем случае чуть быстрее вызова члена интерфейса


Это откуда такие данные?
... << RSDN@Home 1.2.0 alpha 4 rev. 1227 on Windows Vista 6.1.7100.0>>
AVK Blog
Re[2]: Большая реализация метода CompareTo(T)
От: Воронков Василий Россия  
Дата: 23.06.09 22:41
Оценка:
Здравствуйте, Пельмешко, Вы писали:

C>>что еще можно применить кроме реализации IComparble<T> для такого длинного условия ?

П>Чуть-чуть быстрее сортировки с использованием IComparable<T> будет использование делегата Comparator, если метод сортировки позволяет, конечно (насколько помню, вызов делегата в простейшем случае чуть быстрее вызова члена интерфейса, но при 500 элементах это всё такие мелочи, что Вы никогда не заметите разницы).

По скорости вызова делегат как раз медленнее вызова через интерфейс.
Re[3]: Большая реализация метода CompareTo(T)
От: Пельмешко Россия blog
Дата: 24.06.09 04:45
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Пельмешко, Вы писали:

П>>насколько помню, вызов делегата в простейшем случае чуть быстрее вызова члена интерфейса

AVK>Это откуда такие данные?


Чего-то навскидку решил что двойная косвенность при вызове через интерфейс победит оверхед делегата
Как показала практика — безосновательно...

Прошу прощения, дезинформирую...
Re[2]: Большая реализация метода CompareTo(T)
От: corpse56  
Дата: 24.06.09 07:54
Оценка:
Здравствуйте, Пельмешко, Вы писали:


П>Вы не стесняйтесь, приведите эту реализацию, а тут уже подскажут нормально или нет


        public int CompareTo(Book other) // первичное условие - язык. внутри языка сортируется по автору. если автора нет то объектом сортировки становиться заглавие. (вот такая вот фигня)
        {
            
            if (other.language_ > this.language_)
                return 1;
            if (other.language_ < this.language_)
                return -1;
            if (other.language_ == this.language_)
            {
                if ((other.author_ != "") && (this.author_ != "")) 
                {
                    if (other.authorSrt_ > this.authorSrt_)
                        return 1;
                    if (other.authorSrt_ < this.authorSrt_)
                        return -1;
                    if ((other.authorSrt_ == this.authorSrt_) || ((other.author_ == "") && (this.author_ == "")) )
                    {
                        if (other.titleSrt_ > this.titleSrt_)
                            return 1;
                        if (other.titleSrt_ < this.titleSrt_)
                            return -1;
                        if (other.titleSrt_ == this.titleSrt_)
                            return 0;
                    }
                }
                else
                    if ((other.author_ == "") && (this.author_ != "")) 
                    {
                        if (other.titleSrt_ > this.authorSrt_)
                            return 1;
                        if (other.titleSrt_ < this.authorSrt_)
                            return -1;
                        if (other.titleSrt_ == this.authorSrt_)
                            return 0;
                    }
                    else
                        if ((other.author_ != "") && (this.author_ == "")) 
                        {
                            if (other.authorSrt_ > this.titleSrt_)
                                return 1;
                            if (other.authorSrt_ < this.titleSrt_)
                                return -1;
                            if (other.authorSrt_ == this.titleSrt_)
                                return 0;
                        }
                        else
                        {
                            return 0;
                        }
            }           
        }




C>>что еще можно применить кроме реализации IComparble<T> для такого длинного условия ?

П>Чуть-чуть быстрее сортировки с использованием IComparable<T> будет использование делегата Comparator, если метод сортировки позволяет, конечно (насколько помню, вызов делегата в простейшем случае чуть быстрее вызова члена интерфейса, но при 500 элементах это всё такие мелочи, что Вы никогда не заметите разницы).
Понятно. спасибо.

а при каких объемах такое условие начнет сказываться? это мне просто интересно.
Re[3]: Большая реализация метода CompareTo(T)
От: Ovl Россия  
Дата: 24.06.09 08:30
Оценка: 1 (1)
это не настоящий код.
1) операторы >, < для строк по умолчанию не определены. у вас они определяются?
2) возвращающееся значение не всегда определено

но все же мой вариант выглядел примерно так:


public int CompareTo(Book other)
    //первичное условие - язык.
    //внутри языка сортируется по автору.
    //если автора нет то объектом сортировки становиться заглавие. (вот такая вот фигня)
{
    var res = other.language_.CompareTo(language_);
    if (res != 0)
        return res;

    res = other.authorSrt_.CompareTo(authorSrt_);
    if (res != 0)
        return res;

    return other.titleSrt_.CompareTo(titleSrt_);
}
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[3]: Большая реализация метода CompareTo(T)
От: Пельмешко Россия blog
Дата: 24.06.09 08:54
Оценка: 1 (1)
Здравствуйте, corpse56, Вы писали:
C>Понятно. спасибо.

C>а при каких объемах такое условие начнет сказываться? это мне просто интересно.


Не не не, прочитайте топик, я ошибался
Приемущество IComparable<T> над делегатами начнёт проявляться на миллионах итераций

А упростить реализацию Вам прекрасно подсказали как, используйте CompareTo() сравниваемых элементов.
Если у Вас там всё же строки, то реализация совсем не сложная, незачем в таких местах при 500 элементах думать о производительности.
Re[4]: Большая реализация метода CompareTo(T)
От: corpse56  
Дата: 24.06.09 13:01
Оценка:
Здравствуйте, Ovl, Вы писали:

Ovl>это не настоящий код.

Ovl>1) операторы >, < для строк по умолчанию не определены. у вас они определяются?

не знал. но есть метод Compare. его скорее всего и буду использовать

Ovl>2) возвращающееся значение не всегда определено


почему??

Ovl>но все же мой вариант выглядел примерно так:



Ovl>
Ovl>public int CompareTo(Book other)
Ovl>    //первичное условие - язык.
Ovl>    //внутри языка сортируется по автору.
Ovl>    //если автора нет то объектом сортировки становиться заглавие. (вот такая вот фигня)
Ovl>{
Ovl>    var res = other.language_.CompareTo(language_);
Ovl>    if (res != 0)
Ovl>        return res;

Ovl>    res = other.authorSrt_.CompareTo(authorSrt_);
Ovl>    if (res != 0)
Ovl>        return res;

Ovl>    return other.titleSrt_.CompareTo(titleSrt_);
Ovl>}
Ovl>


ну суть я понял, только ваш вариант под мои условия не подходит. если отсутствует автор в other, то сравниватся заглавие other с автором this.

спасибо за ответы!!!
Re[4]: Большая реализация метода CompareTo(T)
От: corpse56  
Дата: 24.06.09 13:02
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Здравствуйте, corpse56, Вы писали:

C>>Понятно. спасибо.

C>>а при каких объемах такое условие начнет сказываться? это мне просто интересно.


П>Не не не, прочитайте топик, я ошибался

П>Приемущество IComparable<T> над делегатами начнёт проявляться на миллионах итераций

П>А упростить реализацию Вам прекрасно подсказали как, используйте CompareTo() сравниваемых элементов.

П>Если у Вас там всё же строки, то реализация совсем не сложная, незачем в таких местах при 500 элементах думать о производительности.

спасибо!
Re[5]: Большая реализация метода CompareTo(T)
От: Ovl Россия  
Дата: 24.06.09 13:14
Оценка:
Ovl>>2) возвращающееся значение не всегда определено

C>почему??


представьте что ситуация будет такой:

if (other.language_ == this.language_) // true
{
    if ((other.author_ != "") && (this.author_ != ""))  // true
    {
        if (other.authorSrt_ > this.authorSrt_) // false
            return 1;
        if (other.authorSrt_ < this.authorSrt_) // false
            return -1;
        if ((other.authorSrt_ == this.authorSrt_) || ((other.author_ == "") && (this.author_ == "")) ) // false
        {
           /* ... */
        }
    }
    else {
        /* ... */
    }

какое значение генерировать для возврата? компилятор не обманешь

зы. кстати, непонятно зачем там оказалось ((other.author_ == "") && (this.author_ == ""))
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[6]: Большая реализация метода CompareTo(T)
От: corpse56  
Дата: 24.06.09 13:51
Оценка:
Здравствуйте, Ovl, Вы писали:

Ovl>>>2) возвращающееся значение не всегда определено


C>>почему??


Ovl>представьте что ситуация будет такой:


Ovl>
Ovl>if (other.language_ == this.language_) // true
Ovl>{
Ovl>    if ((other.author_ != "") && (this.author_ != ""))  // true
Ovl>    {
Ovl>        if (other.authorSrt_ > this.authorSrt_) // false
Ovl>            return 1;
Ovl>        if (other.authorSrt_ < this.authorSrt_) // false
Ovl>            return -1;
Ovl>        if ((other.authorSrt_ == this.authorSrt_) || ((other.author_ == "") && (this.author_ == "")) ) // false
Ovl>        {
Ovl>           /* ... */
Ovl>        }
Ovl>    }
Ovl>    else {
Ovl>        /* ... */
Ovl>    }

Ovl>

Ovl>какое значение генерировать для возврата? компилятор не обманешь
не могут все три быть ложью. только три варианта: больше, меньше либо равно. вот что у меня получилось:

        public int CompareTo(Book other) // первичное условие - язык. внутри языка сортируется по автору. если автора нет то объектом сортировки становиться заглавие. (вот такая вот фигня)
        {
            int res = String.Compare(other.language_, this.language_);
            if (res != 0)
                return res;
  
            if ((other.author_ != "") && (this.author_ != "")) //в обоих книгах есть автор
            {
                res = String.Compare(other.authorSrt_, this.authorSrt_);
                if (res != 0)
                    return res;
            }
            if ((other.author_ == "") && (this.author_ != "")) //во входном объекте книги автора нет, в текущем есть - сравниваем по заглавию входного объекта книги и автору текущего
            {
                res = String.Compare(other.titleSrt_, this.authorSrt_);
                if (res != 0)
                    return res;
            }
            if ((other.author_ != "") && (this.author_ == "")) //во входном объекте книги автор есть, в текущем нет - сравниваем по автору входного объекта книги и заглавию текущего
            {
                res = String.Compare(other.authorSrt_, this.titleSrt_);
                if (res != 0)
                    return res;
            }
            //if ((other.author_ == "") && (this.author_ == "")) // авторов нет - сортируем по заглавию
            //{
            return res = String.Compare(other.titleSrt_, this.titleSrt_);
                //if (res != 0)
                //    return res;
            //}
        }



Ovl>зы. кстати, непонятно зачем там оказалось ((other.author_ == "") && (this.author_ == ""))

это и правда лишнее
Re[7]: Большая реализация метода CompareTo(T)
От: Ovl Россия  
Дата: 24.06.09 15:36
Оценка:
Ovl>>какое значение генерировать для возврата? компилятор не обманешь
C>не могут все три быть ложью.

а что мешает?
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[8]: Большая реализация метода CompareTo(T)
От: corpse56  
Дата: 25.06.09 14:15
Оценка:
Здравствуйте, Ovl, Вы писали:

Ovl>>>какое значение генерировать для возврата? компилятор не обманешь

C>>не могут все три быть ложью.

Ovl>а что мешает?


3 результата: больше, меньше или равно. и для каждого существует условие. или я что-то упускаю?
Re[9]: Большая реализация метода CompareTo(T)
От: Ovl Россия  
Дата: 25.06.09 15:26
Оценка:
Здравствуйте, corpse56, Вы писали:

C>Здравствуйте, Ovl, Вы писали:


Ovl>>>>какое значение генерировать для возврата? компилятор не обманешь

C>>>не могут все три быть ложью.

Ovl>>а что мешает?


C>3 результата: больше, меньше или равно. и для каждого существует условие. или я что-то упускаю?


результат этих операций может зависеть от фазы луны или от рандома, например.

если бы было:
if (...) {
return -1;
}
else if (...) {
return 1;
}
else {
return 0;
}

то можно сказать — всегда сработает один из трех ретурнов. в вашем случае — нет, поскольку цепочка имеет дырку, когда все условия вернут false.

о чем спор-то? все равно ваш пример не построится.
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[7]: Большая реализация метода CompareTo(T)
От: Pro100Oleh Украина  
Дата: 25.06.09 16:28
Оценка: 2 (1)
Здравствуйте, corpse56, Вы писали:
C>вот что у меня получилось:

C>
C>        public int CompareTo(Book other) // первичное условие - язык. внутри языка сортируется по автору. если автора нет то объектом сортировки становиться заглавие. (вот такая вот фигня)
C>        {
C>            int res = String.Compare(other.language_, this.language_);
C>            if (res != 0)
C>                return res;
  
C>            if ((other.author_ != "") && (this.author_ != "")) //в обоих книгах есть автор
C>            {
C>                res = String.Compare(other.authorSrt_, this.authorSrt_);
C>                if (res != 0)
C>                    return res;
C>            }
C>            if ((other.author_ == "") && (this.author_ != "")) //во входном объекте книги автора нет, в текущем есть - сравниваем по заглавию входного объекта книги и автору текущего
C>            {
C>                res = String.Compare(other.titleSrt_, this.authorSrt_);
C>                if (res != 0)
C>                    return res;
C>            }
C>            if ((other.author_ != "") && (this.author_ == "")) //во входном объекте книги автор есть, в текущем нет - сравниваем по автору входного объекта книги и заглавию текущего
C>            {
C>                res = String.Compare(other.authorSrt_, this.titleSrt_);
C>                if (res != 0)
C>                    return res;
C>            }
C>            //if ((other.author_ == "") && (this.author_ == "")) // авторов нет - сортируем по заглавию
C>            //{
C>            return res = String.Compare(other.titleSrt_, this.titleSrt_);
C>                //if (res != 0)
C>                //    return res;
C>            //}
C>        }

C>


Вот вариант исправленный и упрощенный:
    public class Book
    {
        public string language_;
        public string author_;
        public string titleSrt_;
        public string authorSrt_;

        public int CompareTo(Book other)
        {
            int res = String.Compare(this.language_, other.language_); //fixed comparing order
            if (res != 0) return res;

            string a = this.author_ != "" ? this.authorSrt_ : this.titleSrt_;
            string b = other.author_ != "" ? other.authorSrt_ : other.titleSrt_;
            return String.Compare(a, b);
        }
    }
Pro
Re[8]: Большая реализация метода CompareTo(T)
От: Ziaw Россия  
Дата: 26.06.09 05:46
Оценка:
Здравствуйте, Pro100Oleh, Вы писали:

PO>
PO>    public class Book
PO>    {
PO>        public string language_;
PO>        public string author_;
PO>        public string titleSrt_;
PO>        public string authorSrt_;

PO>        public int CompareTo(Book other)
PO>        {
PO>            int res = String.Compare(this.language_, other.language_); //fixed comparing order
PO>            if (res != 0) return res;

PO>            string a = this.author_ != "" ? this.authorSrt_ : this.titleSrt_;
PO>            string b = other.author_ != "" ? other.authorSrt_ : other.titleSrt_;
PO>            return String.Compare(a, b);
PO>        }
PO>    }
PO>


Здесь автор может сравниваться с названием, я правильно понял?
... << RSDN@Home 1.2.0 alpha 4 rev. 1228>>
Re[9]: Большая реализация метода CompareTo(T)
От: Pro100Oleh Украина  
Дата: 26.06.09 08:28
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Здесь автор может сравниваться с названием, я правильно понял?


Я всего лишь повторил логику из авторского кода. Что с чем сравнивается сказать не могу, так как мне не ясно назначение поля "authorSrt_".
Pro
Re[8]: Большая реализация метода CompareTo(T)
От: corpse56  
Дата: 26.06.09 09:24
Оценка:
Здравствуйте, Pro100Oleh, Вы писали:

PO>Вот вариант исправленный и упрощенный:

PO>
PO>    public class Book
PO>    {
PO>        public string language_;
PO>        public string author_;
PO>        public string titleSrt_;
PO>        public string authorSrt_;

PO>        public int CompareTo(Book other)
PO>        {
PO>            int res = String.Compare(this.language_, other.language_); //fixed comparing order
PO>            if (res != 0) return res;

PO>            string a = this.author_ != "" ? this.authorSrt_ : this.titleSrt_;
PO>            string b = other.author_ != "" ? other.authorSrt_ : other.titleSrt_;
PO>            return String.Compare(a, b);
PO>        }
PO>    }
PO>



это гениально!
Re[9]: Большая реализация метода CompareTo(T)
От: corpse56  
Дата: 26.06.09 09:25
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, Pro100Oleh, Вы писали:


PO>>
PO>>    public class Book
PO>>    {
PO>>        public string language_;
PO>>        public string author_;
PO>>        public string titleSrt_;
PO>>        public string authorSrt_;

PO>>        public int CompareTo(Book other)
PO>>        {
PO>>            int res = String.Compare(this.language_, other.language_); //fixed comparing order
PO>>            if (res != 0) return res;

Z>PO>            string a = this.author_ != "" ? this.authorSrt_ : this.titleSrt_;
PO>>            string b = other.author_ != "" ? other.authorSrt_ : other.titleSrt_;
Z>PO>            return String.Compare(a, b);
PO>>        }
PO>>    }
PO>>


Z>Здесь автор может сравниваться с названием, я правильно понял?


да. если автора нет, то вместо него выступает заглавие. а заглавие есть всегда
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.