2014-10-28 1 views
1

Скажем, у меня есть следующий список:В Coldfusion как прикажете список в алфавитном порядке, то численно

<cfset myList = "1a,2b,3c,aa,bb,cc" > 

Как отсортировать этот список, так что это будет «аа, бб, куб.см, 1а, 2б, 3в "? Другими словами, я хочу, чтобы все, что начинается с числа, которое должно быть в конце списка и в порядке количества, с которого оно начинается.

+0

Какую версию CF вы используете? Не совсем тот же вопрос, но вы можете взглянуть на: http://stackoverflow.com/questions/25048779/sorting-array-by-custom-order-in-coldfusion/25049147#25049147 – Henry

+0

Этот список должен откуда-то откуда-то. Ищите возможность правильно сортировать его по мере его создания, а не после его создания. –

+0

@DanBracuk Он исходит из базы данных любого вида по функциям, которые будут делать это в SQL? – user3376065

ответ

0

@Henry имел рабочий ответ на мой сервер CF9 однако, когда я включил в моем списке с 2000 или около того пунктов в нем, этот метод будет иметь значительную задержку, так что я в конечном итоге придумывают мой собственный способ сделать это, который оказался очень быстро:

<cfset digits = "0,1,2,3,4,5,6,7,8,9"> 
<cfset numList = ""> 

<cfloop index="item" list="#arguments.input#"> 
    <cfif ListFindNoCase(digits, Left(item, 1)) > 
     <cfset numindex = ListFindNoCase(arguments.input, item) > 
     <cfset numList = ListAppend(numList, item)> 
     <cfset arguments.input = ListDeleteAt(arguments.input, numindex) > 
    </cfif> 
</cfloop> 

<cfset numList = ListSort(numList, "textnocase", "asc") > 
<cfset arguments.input = ListSort(arguments.input, "textnocase", "asc") > 
<cfset arguments.input = ListAppend(arguments.input, numList)> 

<cfreturn arguments.input > 

+0

Почему бы просто не отсортировать его в своем db-запросе [как предлагается здесь] (http://stackoverflow.com/a/26617032/104223)? Вы не упомянули свои dbms, поэтому вам может понадобиться настроить sql. – Leigh

0

Вот как это сделать в базе данных. Это показывает общую идею. Специфика зависит от механизма базы данных, который вы не указали.

select field1, field2, etc 
, case when substr(field1, 1, 1) between '0' and '9' then 2 else 1 end sortby 
etc 

order by sortby, field1 
+0

Как бы выглядел ваш sql для MS SQL? – user3376065

5

Это будет работать, если вы находитесь на CF10 +.

<cfscript> 
    values = listToArray("1a,2b,3c,aa,bb,cc"); 
    arraySort(values, function(e1, e2) { 
     var diff = val(e1) - val(e2); 
     if(diff != 0) 
      return diff; 
     return e1 < e2 ? -1 : 1; 
    }); 
    writedump(values); 
</cfscript> 

Пробег: http://www.trycf.com/scratch-pad/pastebin?id=kKY9y2Nn

UPDATE

Но так как вы используете CF9:

<cfscript> 
    function customSort(input) { 
     var sorted = false; 
     while (!sorted) { 
      sorted = true; 
      for (var i = 1; i < arrayLen(input); i++) { 
       var e1 = input[i]; 
       var e2 = input[i + 1]; 
       var diff = val(e1) - val(e2); 
       if (diff == 0 ? e1 > e2 : diff > 0) { 
        arraySwap(input, i, i + 1); 
        local.sorted = false; 
       } 
      } 
     } 
     return input; 
    } 
    values = listToArray("1a,2b,3c,3a,aa,bb,cc"); 
    writeDump(customSort(values)); 
</cfscript> 

Пробег: http://www.trycf.com/scratch-pad/pastebin?id=XK3fQv9T

+0

Мои данные поступают из базы данных, я бы не знал, что это за руки. – user3376065

+0

Проверьте его, если он работает, отметьте его как правильно. – Henry

+0

спасибо, кажется, работает с образцом моих данных. – user3376065

2

Я предполагаю, что вы используете MySql , Я не уверен, будет ли это работать на других, но я думаю, что так и должно быть. Вы можете сделать это на уровне базы данных, если источником значений является один столбец. Попробуйте это:

SELECT column_name 
FROM your_table 
ORDER BY IF(name RLIKE '^[a-z]', 1, 2), name 

Смотреть это runnable example on SQLFiddle.com

+0

Упование продемонстрировать это Теория? –

+0

@ Дэн, я только что покинул офис. Сейчас я нахожусь на мобильном телефоне. Я сделаю это завтра, или вы можете создать тестовую таблицу и проверить ее. –

+0

@DanBracuk, я немного изменил запрос, поскольку предыдущий запрос был не поддерживая все сценарии, но этот запрос поддерживает все сценарии. Я также добавил пример на sqlfiddle. –