2015-07-29 2 views
2

Мне нужен сортировка массива, сортировка элементов из предварительно упорядоченного массива в том же порядке. Пример:Сортировка массива, определение приоритетов для некоторых элементов

Input:  [ 5, 4, 7, 2, 3, 9, 8 ] 
Preordered: [ 1, 2, 4, 3 ] 

В основном, preordered массив заставит input массив следовать этот заказ, но только если элемент существует на обоих. Если этого не существует, будет проверяться следующий индекс. Элементы, которые не существуют в массиве preordered, сохранятся в исходном порядке. Продолжая пример:

    ▼  ▼ ▼   // exists on preordered array 
Input:  [ 5, 4, 7, 2, 3, 9, 8 ] 

       ▼   // not exists on index array, so ignore it: 
Preordered: [ 1, 2, 4, 3 ].intersect(input) => [ 2, 4, 3 ] 

При том, что мы можем определить, что три пункта input существует на preordered массиве. Таким образом, эти предметы будут первыми по результату. Остальные пункты input будет держать оригинальный заказ, но после первого рода:

   ▼ ▼ ▼    // keeping preordered array order 
Result:  [ 2, 4, 3, 5, 7, 9, 8 ] 
         ▲ ▲ ▲ ▲ // keeping others items original order 

Обратите внимание, что предупорядоченное сохранит первоначальный порядок.

PS. Я могу использовать underscore, при необходимости.

+5

Так что ничего не нужно сортировать в конечном счете, просто группируя пересечение, добавляя их и добавляя остатки входного массива впоследствии? – Trace

+0

Могут ли 'Input' и/или' Preordered' иметь дубликаты? –

+0

@depperm Я пробовал раньше и не работал (я не помню перекресток), но при написании он помогает мне решить мою проблему - ответы на первом месте и мне очень помогают. Но как его можно использовать для других разработчиков (возможно?), Поэтому я разместил его. –

ответ

4

Нравится?

result = _.intersection(Preordered, Input).concat(
    _.difference(Input, Preordered)) 
+0

Не уверен насчет нисходящего потока, я имел в виду то же самое. По крайней мере, так описал вопрос. – Trace

+1

@KimGysen: с репутацией 68K, georg должен знать * «Как это?» * Является страшным оправданием для ответа. –

+0

Я не тот, что был downvoted, но я думаю, что в этом решении отсутствует порядок пересечения предварительно упорядоченного/ввода. Я думаю, что разница не упорядочена, но пересечение – JSantos

Смежные вопросы