Может есть примеры 2D массива, чтобы вникнуть в проблемуИмеется в виду приоритеты значений в остальных колонках.
Любой двумерный массив, в сортируемой колонке которого есть хотя бы одна пара одинаковых значений. С точки зрения обычной сортировки одинаковые значения выглядят одинаково, поэтому в результате всё равно, какое из одинаковых значений окажется раньше, а какое - позже. Но одновременно с сортируемой колонкой переставляются и остальные колонки, в которых значения могут быть различными, а потому для них порядок важен. Логичнее всего в таких случаях такая перестановка, при которой строки с одинаковыми ключевыми (то есть сортируемыми) значениями попросту остаются в соответствии с начальным порядком (например, как это работает при расширенной сортировке в Excel), но в работе означенной функции это работает как-то иначе, причём в справке описания на этот счёт нет.Может есть примеры 2D массива, чтобы вникнуть в проблему
#include <Array.au3>
Local $avArray[20][3] = [ _
[1, 1, 7], _
[1, 2, 3], _
[2, 1, 7], _
[2, 2, 2], _
[1, 1, 3], _
[1, 2, 5], _
[1, 3, 2], _
[2, 1, 7], _
[2, 2, 5], _
[2, 3, 5], _
[3, 1, 7], _
[3, 2, 2], _
[3, 3, 3], _
[1, 1, 2], _
[2, 2, 7], _
[3, 3, 2], _
[3, 1, 5], _
[2, 2, 3], _
[2, 2, 7], _
[1, 3, 5] _
]
$iStart = InputBox("", "Input the value of $iStart", 0)
$iEnd = InputBox("", "Input the value of $iEnd", 0)
$iSubItem = InputBox("", "Input the value of $iSubItem", 2)
_ArrayDisplay($avArray, "Before")
_ArraySort($avArray, 0, $iStart, $iEnd, $iSubItem)
_ArrayDisplay($avArray, "After" )
И всёже есть определённая закономерность.Тесты с различными данными привели к непредсказуемому поведению.
#include <Array.au3>
Local $avArray[20][3] = [ _
[1, 1, 7], _
[1, 2, 3], _
[2, 1, 7], _
[2, 2, 2], _
[1, 1, 3], _
[1, 2, 5], _
[1, 3, 2], _
[2, 1, 7], _
[2, 2, 5], _
[2, 3, 5], _
[3, 1, 7], _
[3, 2, 2], _
[3, 3, 3], _
[1, 1, 2], _
[2, 2, 7], _
[3, 3, 2], _
[3, 1, 5], _
[2, 2, 3], _
[2, 2, 7], _
[1, 3, 5] _
]
$iStart=0
$iEnd=0
$iSubItem=2
; $iStart = InputBox("", "Input the value of $iStart", 0)
; $iEnd = InputBox("", "Input the value of $iEnd", 0)
; $iSubItem = InputBox("", "Input the value of $iSubItem", 2)
$iUb0=UBound($avArray,0)
$iUb=UBound($avArray)
ReDim $avArray[$iUb][$iUb0+2]
_ArrayDisplay($avArray,'Before1')
Local $Item[]
If $iEnd=0 Then $iEnd=$iUb-1
For $i=$iStart To $iEnd
$Item[$avArray[$i][$iSubItem]]+=1
$avArray[$i][$iUb0+1]=$avArray[$i][$iSubItem]&'_'&$Item[$avArray[$i][$iSubItem]]
Next
_ArrayDisplay($avArray,'Before2')
_ArraySort($avArray,0,$iStart,$iEnd,$iUb0+1)
_ArrayDisplay($avArray,'After1')
ReDim $avArray[$iUb][$iUb0+1]
_ArrayDisplay($avArray,'After2')
#include <Array.au3>
Local $avArray[25][3] = [ _
[1, 1, 7], _
[1, 2, 3], _
[2, 1, 7], _
[2, 2, 2], _
[1, 1, 3], _
[1, 2, 5], _
[1, 3, 2], _
[2, 1, 7], _
[2, 2, 5], _
[2, 3, 5], _
[3, 1, 7], _
[3, 2, 2], _
[3, 3, 3], _
[1, 1, 2], _
[2, 2, 7], _
[3, 3, 2], _
[3, 1, 5], _
[2, 2, 3], _
[2, 2, 7], _
[21, 22, 2], _
[33, 32, 2], _
[65, 43, 2], _
[87, 45, 2], _
[54, 4215, 2], _
[1, 3, 5] _
]
$iStart=0
$iEnd=0
$iSubItem=2
; $iStart = InputBox("", "Input the value of $iStart", 0)
; $iEnd = InputBox("", "Input the value of $iEnd", 0)
; $iSubItem = InputBox("", "Input the value of $iSubItem", 2)
$iUb0=UBound($avArray,0)
$iUb=UBound($avArray)
ReDim $avArray[$iUb][$iUb0+2]
_ArrayDisplay($avArray,'Before1')
Local $Item[]
If $iEnd=0 Then $iEnd=$iUb-1
For $i=$iStart To $iEnd
$Item[$avArray[$i][$iSubItem]]+=1
$avArray[$i][$iUb0+1]=$avArray[$i][$iSubItem]&'_'&StringFormat("%09d",$Item[$avArray[$i][$iSubItem]])
Next
_ArrayDisplay($avArray,'Before2')
_ArraySort($avArray,0,$iStart,$iEnd,$iUb0+1)
_ArrayDisplay($avArray,'After1')
ReDim $avArray[$iUb][$iUb0+1]
_ArrayDisplay($avArray,'After2')
ObjCreate('System.Collections.Hashtable')
Вам придётся обновить версию Autoit для Map функций https://www.autoitscript.com/autoit3/docs/functions/Map Management.htmДальше этого не идет
#include <Array.au3>
Local $avArray[25][3] = [ _
[1, 1, 7], _
[1, 2, 3], _
[2, 1, 7], _
[2, 2, 2], _
[1, 1, 3], _
[1, 2, 5], _
[1, 3, 2], _
[2, 1, 7], _
[2, 2, 5], _
[2, 3, 5], _
[3, 1, 7], _
[3, 2, 2], _
[3, 3, 3], _
[1, 1, 2], _
[2, 2, 7], _
[3, 3, 2], _
[3, 1, 5], _
[2, 2, 3], _
[2, 2, 7], _
[21, 22, 2], _
[33, 32, 2], _
[65, 43, 2], _
[87, 45, 2], _
[54, 4215, 2], _
[1, 3, 5] _
]
$iStart=0
$iEnd=0
$iSubItem=2
; $iStart = InputBox("", "Input the value of $iStart", 0)
; $iEnd = InputBox("", "Input the value of $iEnd", 0)
; $iSubItem = InputBox("", "Input the value of $iSubItem", 2)
$iUb0=UBound($avArray,0)
$iUb=UBound($avArray)
ReDim $avArray[$iUb][$iUb0+2]
_ArrayDisplay($avArray,'Before1')
Local $Item=ObjCreate('System.Collections.Hashtable')
If $iEnd=0 Then $iEnd=$iUb-1
For $i=$iStart To $iEnd
$Item($avArray[$i][$iSubItem])+=1
$avArray[$i][$iUb0+1]=$avArray[$i][$iSubItem]&'_'&StringFormat("%09d",$Item($avArray[$i][$iSubItem]))
Next
$Item.Clear
; Local $Item[]
; If $iEnd=0 Then $iEnd=$iUb-1
; For $i=$iStart To $iEnd
; $Item[$avArray[$i][$iSubItem]]+=1
; $avArray[$i][$iUb0+1]=$avArray[$i][$iSubItem]&'_'&StringFormat("%09d",$Item[$avArray[$i][$iSubItem]])
; Next
_ArrayDisplay($avArray,'Before2')
_ArraySort($avArray,0,$iStart,$iEnd,$iUb0+1)
_ArrayDisplay($avArray,'After1')
ReDim $avArray[$iUb][$iUb0+1]
_ArrayDisplay($avArray,'After2')
Пока нет возможности, нужно некоторые библиотеки перелопатить.Вам придётся обновить версию Autoit для Map функций
$Item($avArray[$i][$iSubItem])+=1
$Item^ ERROR
В примере же нет вызова Map-футкций
$Item[$avArray[$i][$iSubItem]]+=1
- это и есть элемент возможностей MAP функций.Закономерность и предсказуемость это немного разные вещи. Вопрос в том, как заранее знать в точности, к какому результату приводит работа функции.И всёже есть определённая закономерность.
А вы вообще проверяли мой код? Всё очевидноИз ответов не совсем ясно, какую цель можно преследовать предложенными методами
Вы бы привели пример начального массива в новом топике и то что хотите получить из него - а так вообще ничего не понятно...В идеале хотелось бы решать ещё более общую задачу, но она слишком уж выходит за рамки этой темы, поэтому сформулирую эту задачу в новом топике
А можно поинтересоваться, за счёт чего гарантируется именно такая последовательность? Чтобы хотя бы понять общую идею.То что я предложил - где сохраняется последовательность встретившихся значений
Логичнее этот вопрос там и задавать. Метод сортировки вообще не важен, если он работает достаточно быстро. Даже неважно, что там в массиве, важно лишь, чтобы сравнение для сортировки можно было заменить с обычного на произвольное, которое может выдавать любая функция. То есть так, словно в любом месте кода сортировки написаноВы бы привели пример начального массива в новом топике и то что хотите получить из него - а так вообще ничего не понятно...
Методов сортировки куча - (От пузырьковой, шейкерной, расчёской, .... до сортировкой гномья) - что вам именно нужно никто не знает
_MyFunc($x, $y)
вместо $x < $y
.Если посмотреть мой код, то там всё видно (_ArrayDisplay показывает все изменения):А можно поинтересоваться, за счёт чего гарантируется именно такая последовательность?
"Тут нет определённых типов данных" - вы имеете ввиду структуры, объекты, массивы, логический тип данных, указатели и.т.п?...универсальностью здесь, к сожалению, не пахнет
Вы правы. Я хотел подвести к тому, что если закономерность есть, то её можно использовать, поняв по какому принципу она работает. Сделать это можно только переделкой __ArrayQuickSort2D из библиотеки Array, но Вы это и сами знаете.Закономерность и предсказуемость это немного разные вещи. Вопрос в том, как заранее знать в точности, к какому результату приводит работа функции.
Для этого варианта предложенный Andrey_A способ , наверное, самый подходящий, если именно это должно быть на выходе, но vvvvЛогичнее всего в таких случаях такая перестановка, при которой строки с одинаковыми ключевыми (то есть сортируемыми) значениями попросту остаются в соответствии с начальным порядком (например, как это работает при расширенной сортировке в Excel)
Ответ Вы уже знаете ....Например, возможно ли отсортировать двумерную таблицу по одному заданному столбцу, так что при равенстве значений приоритетность определяется другим заданным столбцом? Или для каких других целей все эти примеры и соображения?
Напротив, я хотел увидеть как Вы так легко сделали то же самое всего парой строк, но я не знал о каком варианте выходных данных Вы говорите.3. На крайний случай можно подключить 'Scripting.Dictionary' , пример не буду выкладывать - видимо вам не сильно и нужно решение
"Решение" под конкретный массив это чрезвычайно далеко от того, чтобы называться решением, не надо, пожалуйста, передёргивать."Тут нет определённых типов данных" - вы имеете ввиду структуры, объекты, массивы, логический тип данных, указатели и.т.п?...
Не надо скатываться в демагогию, которой с радостью рукоплещет только прибежавший лайкнуть эту чушь демагог-любитель."Часто подобные трюки тоже использую" - если бы вы использовали такие "трюки", то не задавали бы простых вопросов про методы и последовательность, когда в коде с помощью _ArrayDisplay() всё и так ОЧЕвидно, тем более их 4 штуки в моём коде на каждом этапе изменений и итоговой реализации...
Ну именно потому в стартовом посте топика поднят этот вопрос. Мне именно хотелось понять, какова закономерность, но не экспериментально с вероятностью ошибки или с получением только узкой закономерности (не описывающей всего поведения), а более надёжно и полно от тех, кто знают, как это устроено в реальности, а тогда уж можно и сообразить, как разумно эксплуатировать устройство функции, которое забыли упомянуть в справке. Между прочим, мы тут исписали уже кучу строк текста и кучу кода, в котором по соврешенно непонятной причине вменялось разбираться, а ответа на поставленный вопрос в стартовом посте топика никто даже не коснулся.Вы правы. Я хотел подвести к тому, что если закономерность есть, то её можно использовать, поняв по какому принципу она работает.
Нет, его способ это всего лишь трюк, который предполагает, что данные будут устроены только таким образом, как в упрощённом примере. В большинстве случаев этот трюк не годится, хотя в определённых ситуациях, когда о данных что-то доподлинно известно, подобные трюки вполне могут упростить код (правда, не без ущерба культуре написания кода). Для практических нужд скорее подходит твой вышеизложенный костыль. Он хотя бы универсален, а не зависит от того, небольшие неотрицательные целые числа находятся в массиве или другие простые данные.Для этого варианта предложенный Andrey_A способ , наверное, самый подходящий, если именно это должно быть на выходе