Что нового

Как заместить в массиве ячейку d ячейкой g чтобы сработало автоперераспределение

mmsgeorge

Новичок
Сообщения
96
Репутация
0
Здравствуйте! Интересует, как заменить в массиве состоящем из элементов (указанны везде индексы, а не значения) 1 2 3 4 5 6, к примеру 2-ой элемент 4-ым , чтобы потом получился массив со смещением 1 4 2 3 5 6.
Пытался сделать такой алгоритм, что 4-ой элемент перемещался на 2-ую позицию. получался такой массив 1 (2,4) 3 4 5 6 ,2-ой элемент сохранялся, потом 4-ому элементу присваивался индекс 2-ого , и делал сдвиг, получалось 1 4 2 3 5 6.
Но если менять к примеру 1-ый на место 6-ого, то такой алгоритм не работает. 1 2 3 4 5 (6,1) , далее сохранялся 6-ой, и присвоение 1-ому , индекс 6-ого и сдвиг, получалось 1 2 3 4 5 1 6 , а НАДО, чтобы получилось 2 3 4 5 1 6
 
A

Alofa

Гость
Код:
#include <Array.au3>

Local $avArray[3] = ["Мир!", "Этот", "Привет"]

_ArrayDisplay($avArray, "Массив перед _ArraySwap()")
_ArraySwap($avArray, 0, 2) ; Инфо: https://www.autoitscript.com/autoit3/docs/libfunctions/_ArraySwap.htm
_ArrayDisplay($avArray, "Массив после _ArraySwap()")
 
Автор
M

mmsgeorge

Новичок
Сообщения
96
Репутация
0
Alofa
Не совсем то что нужно.
Код:
#include <Array.au3>

Local $avArray[5] = ["1", "2", "3","4","5"]

_ArrayDisplay($avArray, "Массив перед _ArraySwap()")
_ArraySwap($avArray, 2, 4) ; Инфо: https://www.autoitscript.com/autoit3/docs/libfunctions/_ArraySwap.htm
_ArrayDisplay($avArray, "Массив после _ArraySwap()")

индексы 0 1 2 3 4, элементы массива 1 2 3 4 5, меняем индексы 2 с 4, получается элементы массива 1 2 5 4 3, а надо, чтобы получилось элементы массива 1 5 2 3 4
Чтобы не менялись местами, а 4-ый вставал на место 2-ого, и происходило смещение, то есть элементы массива 1 5 2 3 4
 
A

Alofa

Гость
Как-то так?
Код:
#include <Array.au3>

Global $avMyArray[5] = ["Значение 1", "Значение 2", "Значение 3", "Значение 4", "Значение 5"]
$iOldPos = 4 ; Позиция (индекс) элемента
$iNewPos = 1 ; Позиция в которую перемещаем элемент

_ArrayDisplay($avMyArray, "Массив ПЕРЕД")
_ArrayMove($avMyArray, $iOldPos, $iNewPos)
_ArrayDisplay($avMyArray, "Массив ПОСЛЕ")

Func _ArrayMove(ByRef $avArray, $iIndexOld, $iIndexNew)
	Local $iSize = UBound($avArray) - 1
	If Not $iSize Or $iIndexOld > $iSize Or $iIndexNew = $iIndexOld Then Return 0
	Local $vValue = $avArray[$iIndexOld]

	If $iIndexNew > $iIndexOld Then
		$iIndexNew += 1
	Else
		$iIndexOld += 1
	EndIf
	
	If $iIndexNew > $iSize Then
		_ArrayAdd($avArray, $vValue)
	Else
		_ArrayInsert($avArray, $iIndexNew, $vValue)
	EndIf

	_ArrayDelete($avArray, $iIndexOld)
EndFunc   ;==>_My_Insert
 
Автор
M

mmsgeorge

Новичок
Сообщения
96
Репутация
0
Alofa
Благодарю


Добавлено:
Сообщение автоматически объединено:

Alofa
Кстати вот вариант еще, вчера. когда спать шел. придумал.
Код:
#include <Array.au3>
Global $avMyArray[5] = ["Значение 1", "Значение 2", "Значение 3", "Значение 4", "Значение 5"]
Global $avMyArray1[6]
$iOldPos = 4 ; Позиция (индекс) элемента
$iNewPos = 0 ; Позиция в которую перемещаем элемент

_ArrayDisplay($avMyArray, "Массив ПЕРЕД")
_ArrayMove($avMyArray, $iOldPos, $iNewPos)
_ArrayDisplay($avMyArray, "Массив ПОСЛЕ")

Func _ArrayMove(ByRef $avArray, $iIndexOld, $iIndexNew)
Local $iSize = UBound($avArray) - 1
$save=$avArray[$iIndexOld]
 for $i=0 to  $iSize
	$avMyArray1[$i]=$avArray[$i]
 next
 _ArrayDelete($avMyArray1, $iIndexOld)
_ArrayInsert($avMyArray1, $iIndexNew,$save)
for $i=0 to  $iSize
		$avArray[$i]=$avMyArray1[$i]
	next
EndFunc


Добавлено:
Сообщение автоматически объединено:

А вот утром пришло в голову :rofl:
Код:
#include <Array.au3>
Global $avMyArray[6] = ["Значение 1", "Значение 2", "Значение 3", "Значение 4", "Значение 5"]

$iOldPos = 0; Позиция (индекс) элемента
$iNewPos = 1 ; Позиция в которую перемещаем элемент

_ArrayDisplay($avMyArray, "Массив ПЕРЕД")
_ArrayMove($avMyArray, $iOldPos, $iNewPos)
_ArrayDisplay($avMyArray, "Массив ПОСЛЕ")

Func _ArrayMove(ByRef $avArray, $iIndexOld, $iIndexNew)
Local $iSize = UBound($avArray) - 1
$save=$avArray[$iIndexOld]
 _ArrayDelete($avArray, $iIndexOld)
_ArrayInsert($avArray, $iIndexNew,$save)
 _ArrayDelete($avArray, $iSize)
EndFunc
 
A

Alofa

Гость
OffTopic:

mmsgeorge
Ну и ночка у вас выдалась ;D

P.s: код гораздо красивей выглядит и читается легче, если предварительно его обработать "Tidy Autoit Source"
(в зависимости от используемой SciTE, это сочетание клавиш "Alt+T" или "Ctrl+T").
 
Автор
M

mmsgeorge

Новичок
Сообщения
96
Репутация
0
Alofa
о, благодарю, как раз самому интересно было, как так делать!
 
Верх