2013-11-25 4 views
4

Как отсортировать массив определяемых пользователем объектов в D?Как отсортировать массив объектов в Dlang?

Исходя из фона C++, я полагаю, вы должны были бы объявить перегрузку оператора для типа, хранящегося в массиве, или использовать функцию компаратора ...

Пример того, как сделать это будет очень признателен.

ответ

6

Вы хотите, чтобы std.algorithm.sort использовал по умолчанию < b, поэтому ваш класс может переопределить opCmp, чтобы воспользоваться этим.

Обновление: просто альтернатива примеру гламура.

import std.algorithm; 
import std.stdio; 

class Test { 

    int x; 

    this(int x) 
    { 
     this.x = x; 
    } 
} 

void main() 
{ 
    Test[] array = [new Test(3), new Test(1), new Test(4), new Test(2)]; 

    writeln("Before sorting: "); 
    writeln(array.map!(x=>x.x)); 

    sort!((a,b)=>a.x < b.x)(array); // Sort from least to greatest 

    writeln("After sorting: "); 
    writeln(array.map!(x=>x.x)); 
} 
+0

Почему импорт 'std.algorithm.sort', а не просто использовать' array.sort'? –

+1

@Pedro, трудно сказать, является ли это официальным, но должно быть, свойство сортировки массивов устарело. std.algorithm.sort является общим, работает с пользовательскими диапазонами и пользовательскими функциями сортировки. –

+0

@hethegreat Ах, нашел официальные планы, чтобы осудить его: [Устаревшие функции] (http://dlang.org/deprecate.html). благодаря –

7

std.algorithm.sort Использование и opCmp перегрузки:

import std.algorithm; 
import std.stdio; 

class Test 
{ 
    int x; 

    this(int x) 
    { 
     this.x = x; 
    } 

    int opCmp(ref const Test other) const 
    { 
     if (this.x > other.x) 
     { 
      return +1; 
     } 
     if (this.x < other.x) 
     { 
      return -1; 
     } 
     return 0; // Equal 
    } 
}; 

void main() 
{ 
    Test[] array = [new Test(3), new Test(1), new Test(4), new Test(2)]; 

    writeln("Before sorting: "); 
    for (int i = 0; i < array.length; ++i) 
    { 
     write(array[i].x); 
    } 
    writeln(); 

    sort(array); // Sort from least to greatest using opCmp 

    writeln("After sorting: "); 
    for (int i = 0; i < array.length; ++i) 
    { 
     write(array[i].x); 
    } 
    writeln(); 
} 

Какой будет выход:

Before sorting: 
3142 
After sorting: 
1234 
Смежные вопросы