Заводная сортировка цветов радуги - PullRequest
1 голос
/ 19 октября 2011

Учитывая, что цвета радуги упорядочены именно так: ROYGBIV (R = красный, O = оранжевый, Y = желтый, G = зеленый, B = синий, I = индиго и V = фиолетовый), как мне взять список:

def partialUnorderedList =["orange", "blue", "red","green"] 

и отсортируйте его в порядке ROYGBIV, получив:

def  partialOrderedList = ["red", "orange", "green", "blue"]

Ответы [ 4 ]

7 голосов
/ 19 октября 2011

Вот мой взгляд на проблему:

def order = ["red", "orange", "yellow", "green", "blue", "indigo", "violet"]
def input = ["orange", "blue", "red", "green"]

def sorted = input.sort { order.indexOf it }

Он использует позицию индекса в списке ссылок для данного элемента из входного списка в качестве критерия сортировки.

0 голосов
/ 19 октября 2011

Простым решением является использование замыкания для сравнения, например так:

def partialUnorderedList =["orange", "blue", "red","green"]

def order = "roygbiv".inject([:]){ map, letter -> map[letter] = map.size(); map}
def sortedList = partialUnorderedList.sort{ a, b ->
    order[a[0].toLowerCase()] <=> order[b[0].toLowerCase()]
}

Это создает хэш-карту индексов для первых букв цветов.Затем метод сортировки ищет индексы первых методов и сравнивает их.

Это работает, только если вы используете уникальные первые буквы.Чтобы отсортировать полные имена, вы можете сделать что-то вроде этого:

def partialUnorderedList =["orange", "blue", "red","green"]

def order = "red,orange,yellow,green,blue,indigo,violet".split(",").inject([:]){ map, name -> map[name] = map.size(); map}
def sortedList = partialUnorderedList.sort{ a, b ->
    order[a.toLowerCase()] <=> order[b.toLowerCase()]
}
0 голосов
/ 19 октября 2011

Вот самое простое решение вашей проблемы:

def a =["red","orange","yellow","green","blue","indigo","violet"]
def input = ["orange", "blue", "red","green"]
list = []
for(i=0;i<input.size();i++)
{
   index =  a.findIndexValues{ it ==  input[i]}.join() as Integer
   list[index] =  input[i]
}
println list.minus(null)

выходы:

[red, orange, green, blue]

Для других входов:

[yellow, red, blue, orange, violet, indigo]

выводит:

[red, orange, yellow, blue, indigo, violet]

Использовали findIndexValues ​​ в приведенном выше коде.

0 голосов
/ 19 октября 2011

Если вы не против использовать другую библиотеку, Google Guava API может подойти для решения этой проблемы.

def partialUnorderedList = ["orange", "blue", "red", "green"] 
Ordering roygbivOrdering = Ordering.explicit("red", "orange", "yellow", "green", "blue", "indigo", "violet")
def partialOrderedList = roygbivOrdering.sortedCopy(partialUnorderedList)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...