<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Сортировка массива]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=11309&amp;type=atom" />
	<updated>2016-02-10T11:44:54Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=11309</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Сортировка массива]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=100988#p100988" />
			<content type="html"><![CDATA[<p>Ещё возникло 2 вопроса, как узнать размер одномерного массива? Ну узнать сколько там элементов. В моем примере их 7.</p><div class="quotebox"><blockquote><p>Забыл про A_Index. Нашел решение.</p></blockquote></div>]]></content>
			<author>
				<name><![CDATA[tuma4ok]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=32022</uri>
			</author>
			<updated>2016-02-10T11:44:54Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=100988#p100988</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Сортировка массива]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=100987#p100987" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>А почему по вашему коду первое место занимает ключ со значением 12, хотя большее — 22? Так и должно быть?</p></blockquote></div><p>Так не должно было быть, это наверное я не заметил, так как не тестировал на этих цифрах. И спасибо вам за ваши ответы, очень помогло.</p>]]></content>
			<author>
				<name><![CDATA[tuma4ok]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=32022</uri>
			</author>
			<updated>2016-02-10T11:29:28Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=100987#p100987</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Сортировка массива]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=100977#p100977" />
			<content type="html"><![CDATA[<p>В общем, полная сортировка как-то так, а с какого конца пять отбирать, сами решите:<br /></p><div class="codebox"><pre><code>ArrayLEADERS := { Qnton: 5
					 , Wnton: 6
					 , Enton: 12
					 , Rnton: 1
					 , Tnton: 22
					 , Ynton: 5
					 , Unton: 22 }
					 
SortedArray := MySort(ArrayLEADERS)
for k, v in SortedArray
	MsgBox, % v[1] A_Tab v[2]
Return

MySort(obj)  {
	arr := []
	for k, v in obj
		arr.Push([k, v])
	Return Sorting(arr)
}

Sorting(arr)  {
	ArrMin := [], ArrMax := []
	for k, v in arr  {
		if (k = 1)
			continue
		array := arr[k, 2] &lt; arr[1, 2] ? &quot;ArrMin&quot; : &quot;ArrMax&quot;
		%array%.Push(arr[k])
	}
	for k, v in [&quot;ArrMin&quot;, &quot;ArrMax&quot;]
		(%v%.Length() &gt; 1 &amp;&amp; %v% := Sorting(%v%))
	
	Return ArrMin, ArrMin.Push(arr[1]), ArrMin.Push(ArrMax*)
}</code></pre></div><p>Или, если элементов в массиве немного, такой вариант, более короткий, но и более затратный:<br /></p><div class="codebox"><pre><code>ArrayLEADERS := { Qnton: 5
					 , Wnton: 6
					 , Enton: 12
					 , Rnton: 1
					 , Tnton: 22
					 , Ynton: 5
					 , Unton: 22 }
					 
SortedArray := MySort(ArrayLEADERS)
for k, v in SortedArray
	MsgBox, % v[1] A_Tab v[2]
Return

MySort(_obj)  {
	arr := [], obj := _obj.Clone()
	for k, v in obj
		keys .= (A_Index = 1 ? &quot;&quot; : &quot;,&quot;) . v
	Sort, keys, N D,
	Loop, parse, keys, `,
		for k, v in obj
			(A_LoopField = v &amp;&amp; arr.Push([k, v]) &amp;&amp; obj.Delete(k))
	Return arr
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2016-02-09T23:32:40Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=100977#p100977</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Сортировка массива]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=100976#p100976" />
			<content type="html"><![CDATA[<p>А почему по вашему коду первое место занимает ключ со значением 12, хотя большее — 22? Так и должно быть?</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2016-02-09T22:40:37Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=100976#p100976</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: Сортировка массива]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=100975#p100975" />
			<content type="html"><![CDATA[<p>Здравствуйте, уважаемые форумчане. Недавно написал код для сортировки массива от меньшего значения к большему. Но мне кажется что мой код слишком большой и его можно в разы упростить. По этому обращаюсь к вам, к более опытным кодерам.<br />Вариант моей сортировки:<br /></p><div class="codebox"><pre><code>
global ArrayLEADERS := Object()
global ArrayTopLeaders := Object()

ArrayLEADERS[x := &quot;Qnton&quot;] := 5
ArrayLEADERS[x := &quot;Wnton&quot;] := 6
ArrayLEADERS[x := &quot;Enton&quot;] := 12
ArrayLEADERS[x := &quot;Rnton&quot;] := 1
ArrayLEADERS[x := &quot;Tnton&quot;] := 22
ArrayLEADERS[x := &quot;Ynton&quot;] := 5
ArrayLEADERS[x := &quot;Unton&quot;] := 22

LastMaxPoint := 0
LastMaxName := &quot;&quot;
LastListArray := &quot;&quot;
CountPlayers := 0
CountListLeaders := 0

for name, point in ArrayLEADERS {
	if(point &gt; LastMaxPoint) {
		LastMaxPoint := point
		LastMaxName := name
	}
}

LoopLastMaxPoint := LastMaxPoint + 1

Loop % LastMaxPoint {
	LoopLastMaxPoint -= 1
	for name, point in ArrayLEADERS {
		if(LoopLastMaxPoint = point) {
			LastListArray .= name &quot;@&quot;
		}
		CountPlayers := A_Index
	}
}

Loop, Parse, LastListArray, `@
	LastListDescArray := trim(A_LoopField &quot;@&quot; LastListDescArray, &quot;@&quot;)

if(CountPlayers &gt;= 5)
	CountListLeaders := 5
else
	CountListLeaders := CountPlayers

Loop, Parse, LastListDescArray, `@ 
{
	ArrayTopLeaders[ArrayLEADERS[y := A_LoopField], z := A_LoopField] := ArrayLEADERS[x := A_LoopField]
	if(CountListLeaders = A_Index)
		break
}

for key, val in ArrayTopLeaders {
	for name, point in val {
		msgbox % CountListLeaders &quot; место занял &quot; name &quot;, он набрал &quot; point &quot; баллов.&quot;
		CountListLeaders -= 1
	}
}
</code></pre></div><p> </p><p>Полное описание скрипта: Берет массив в ключе которого находится имя, а в значении кол-во очков (число). Дальше идет сортировка от меньшего значения к большему (это число хранится в значении ключа). Но, мне нужно вывести не более 5 значений. </p><p>Если есть варианты как-то упростить код (уменьшить его) напишите, пожалуйста. Очень поможете. Жду ваших ответов и вариантов.</p>]]></content>
			<author>
				<name><![CDATA[tuma4ok]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=32022</uri>
			</author>
			<updated>2016-02-09T21:49:19Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=100975#p100975</id>
		</entry>
</feed>
