Что нового

Как вырезать из массива всё кроме элементов с бла-бла значением из 2го столбца?

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Вот так :
Код:
#include <Array.au3>
 
Dim $avArray[5][2] = [ _
[1, 'бло'], _
[2, 'бля'], _
[3, 'бла-бла'], _
[4, 'бл-бл'], _
[5, 'бла-бла']]

_ArrayDisplay($avArray)
 
For $i=UBound($avArray,1)-1 To 0 Step -1
   If $avArray[$i][1] <> 'бла-бла' Then _ArrayDelete($avArray, $i)
Next	
 
_ArrayDisplay($avArray)
 
Автор
V

VitAl2013

Гость
Сделал функцией:
Код:
#include <Array.au3>
 
Dim $avArray[5][2] = [ _
[1, 'бло'], _
[2, 'бля'], _
[3, 'бла-бла'], _
[4, 'бл-бл'], _
[5, 'бла-бла']]

_ArrayDisplay($avArray, "1")
_ArrayCut($avArray, "бла-бла")
_ArrayDisplay($avArray, "2")

func _ArrayCut($array, $whatleave)
For $i=UBound($array,1)-1 To 0 Step -1
   If $array[$i][1] <> $whatleave Then _ArrayDelete($array, $i)
Next   
EndFunc

Почему не работает?
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
VitAl2013 [?]
Почему не работает?

Вот так работает :
Код:
#include <Array.au3>
 
Dim $avArray[5][2] = [ _
[1, 'бло'], _
[2, 'бля'], _
[3, 'бла-бла'], _
[4, 'бл-бл'], _
[5, 'бла-бла']]

_ArrayDisplay($avArray, "1")
_ArrayCut( "бла-бла",$avArray)
_ArrayDisplay($avArray, "2")

func _ArrayCut( $whatleave ,ByRef $array )
   For $i=UBound($array,1)-1 To 0 Step -1
	  If $array[$i][1] <> $whatleave Then 
		 _ArrayDelete($array, $i)
	  EndIf
   Next   
EndFunc




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

В твоем примере не происходило обновление исходного массива
 
Автор
V

VitAl2013

Гость
А если надо чтоб создавался новый массив, а не резался старый, то как поступить лучше? Нам не известно какой длины массив должен получиться ведь, как быть?

У меня пока так:
Код:
_ArrayDisplay($avArray, "1")
$avArrayBackUp = $avArray
_ArrayCut( "бла-бла",$avArray)
_ArrayDisplay($avArray, "2")
$avArray = $avArrayBackUp
_ArrayCut( "бля",$avArray)
_ArrayDisplay($avArray, "2")

Но это некрасиво выглядит, былобы неплохо еслиб сама функция создавала массив.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
VitAl2013
_ArrayAdd()
 
Автор
V

VitAl2013

Гость
Ругается: сначало что неопределена переменная, а потом просто молчит.
Пытаюсь использовать это:
Код:
#include <Array.au3>
 
Dim $avArray[5][2] = [ _
[1, 'бло'], _
[2, 'бля'], _
[3, 'бла-бла'], _
[4, 'бл-бл'], _
[5, 'бла-бла']]

Local $result
_ArrayDisplay($avArray, "1")
$bla_bla = _ArrayCut( "бла-бла",$avArray)
_ArrayDisplay($bla_bla, "2")

func _ArrayCut( $whatleave ,ByRef $array )
   For $i=UBound($array,1)-1 To 0 Step -1
      If $array[$i][1] <> $whatleave Then
         _ArrayAdd($result, $i)
      EndIf
  Next  
  return $result
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
VitAl2013
1. Массив надо объявить (Dim $result или Dim $result[1])
2. В справке по _ArrayAdd() посмотрите.
 
Автор
V

VitAl2013

Гость
У меня вроде получилось:
Код:
#include <Array.au3>
 
Dim $avArray[5][2] = [ _
[1, 'бло'], _
[2, 'бля'], _
[3, 'бла-бла'], _
[4, 'бл-бл'], _
[5, 'бла-бла']]

Dim $result[1]
_ArrayDisplay($avArray, "1")
$bla_bla = _ArrayCut( "бла-бла",$avArray)
_ArrayDisplay($bla_bla, "2")

func _ArrayCut( $whatleave ,ByRef $array )
   For $i=UBound($array,1)-1 To 0 Step -1
    If $array[$i][1] = $whatleave Then
		_ArrayAdd($result, $array[$i][1])
	EndIf
  Next  
  return $result
EndFunc
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Надо сделать так :

Код:
#include <Array.au3>
 Dim $aNewArray[1][2]
Dim $avArray[5][2] = [ _
[1, 'бло'], _
[2, 'бля'], _
[3, 'бла-бла'], _
[4, 'бл-бл'], _
[5, 'бла-бла']]
Global $j
_ArrayDisplay($avArray)
 
For $i=UBound($avArray,1)-1 To 0 Step -1
  
   If $avArray[$i][1] = 'бла-бла' Then 
	  Redim $aNewArray[UBound($aNewArray,1)+1][2]
	  $j+=1
	  $aNewArray[$j][1]=$avArray[$i][1] 
   EndIf
Next	
 
_ArrayDisplay($aNewArray)



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

VitAl2013 [?]
У меня вроде получилось

Но ты получил одномерный массив



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

И вообще не рекомендуется использовать
Код:
 _ArrayAdd
, т.к. она сильно тормозит .

Гораздо лучше :
1. Объявить вначале массив с единичным размером
2. В дальнейшем при необходимости увеличивать его размер на 1 ( ReDim)
 
Автор
V

VitAl2013

Гость
Да действительно... Вот обмозговал, и преревёл на функцию, добавил и исправил помелочи. Получил:
Код:
#include <Array.au3>
 
Dim $avArray[5][2] = [ _
[1, 'бло'], _
[2, 'бля'], _
[3, 'бла-бла'], _
[4, 'бл-бл'], _
[5, 'бла-бла']]

Dim $array_new[1][2]

_ArrayDisplay($avArray, "1")
$bla_bla = _ArrayCut( "бла-бла",$avArray)
_ArrayDisplay($bla_bla, "2")

func _ArrayCut( $whatleave ,ByRef $array_old)
	For $i=UBound($array_old,1)-1 To 0 Step -1
 
	   If $array_old[$i][1] = 'бла-бла' Then
		  Redim $array_new[UBound($array_new,1)+1][2]
		  $j=+1
		  $array_new[$j][0]=$array_old[$i][0]
		  $array_new[$j][1]=$array_old[$i][1]
	   EndIf
	Next 
  return $array_new
EndFunc

Смущает что вначале и в конце есть пустые элементы массива. Как они получаются? и да... не работает - находит только одну "бла-бла"
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
А у меня так получилось, правда массив одномерный.
Код:
#Include <Array.au3>
#Include <WinAPIEx.au3>

Dim $result[1]
$whatleave = "Button"
$hForm = WinGetHandle("Ad Muncher Configuration")

$array = _WinAPI_EnumChildWindows($hForm)
If IsArray($array) Then
	_ArraySort($array, 0, 1, 0, 1)
    _ArrayDisplay($array, '_WinAPI_EnumChildWindows')
EndIf

_ArrayCut($whatleave, $array)

_ArrayDisplay($result)

Func _ArrayCut($whatleave, ByRef $array)
	$u = 0
	For $i = UBound($array, 1) - 1 To 0 Step -1
		If $array[$i][1] = $whatleave Then
			_ArrayAdd($result, $array[$i][1] & " - " & $array[$i][0])
			$u += 1
			$result[0] = $u
		EndIf
	Next
	Return $result
EndFunc   ;==>_ArrayCut
 
Автор
V

VitAl2013

Гость
madmasles
Получается одномерный массив... мне надо 2Д ибо потом буду использовать хэндлы для вот этого: http://autoit-script.ru/index.php?topic=1364.0 С другой стороны мне нужны только хэндлы, можно код поправить тут:
Код:
_ArrayAdd($result, $array[$i][0])
Но я думаю надо довести до логического конца. Надо чтоб была как функция и вычленяла(копировала) элементы из основного массива.

При повторном использовании функции элементы добавляются к массиву, их каждый раз больше.
Ответ:
Код:
Dim $result[1]
надо внутрь функции впихнуть.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
VitAl2013 [?]
Смущает что вначале и в конце есть пустые элементы массива. Как они получаются? и да... не работает - находит только одну "бла-бла"
Здесь все работает:

Код:
#include <Array.au3>
Dim $aNewArray[1][2],$j=0
Dim $avArray[5][2] = [ _
[1, 'бло'], _
[2, 'бля'], _
[3, 'бла-бла'], _
[4, 'бл-бл'], _
[5, 'бла-бла']]

_ArrayDisplay($avArray, "1")
 $bla_bla=ArrayCut($avArray,'бла-бла')
_ArrayDisplay($bla_bla, "2") 

Func ArrayCut($aArray,$whatleave)
   For $i=UBound($avArray,1)-1 To 0 Step -1
	  If $avArray[$i][1] = $whatleave Then 
		 Redim $aNewArray[UBound($aNewArray,1)+1][2]
		 $j+=1
		 $aNewArray[$j][0]=$avArray[$i][0]
		 $aNewArray[$j][1]=$avArray[$i][1] 
	  EndIf
   Next	
   Return $aNewArray
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
gregaz
Все работает, только я бы добавил
Код:
Func _ArrayCut($avArray, $whatleave)
	$j = 0
	For $i = UBound($avArray, 1) - 1 To 0 Step -1
		If $avArray[$i][1] = $whatleave Then
			ReDim $aNewArray[UBound($aNewArray, 1) + 1][2]
			$j += 1
			$aNewArray[$j][0] = $avArray[$i][0]
			$aNewArray[$j][1] = $avArray[$i][1]
			$aNewArray[0][0] = $j ;Это добавил: кол-во элементов нового массива.
		EndIf
	Next
	Return $aNewArray
EndFunc   ;==>_ArrayCut
У Вас в начале
Код:
Dim $aNewArray[1][2]
У меня так работает
Код:
Dim $aNewArray[1][1]
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
madmasles [?]
Все работает, только я бы добавил

Это не принципиально если использовать Ubound . хотя наверное массив выглядит более законченным

У Вас в начале
Код: AutoIt [Выделить]
Dim $aNewArray[1][2]У меня так работает
Код: AutoIt [Выделить]
Dim $aNewArray[1][1]

Поскольку известно уже ,что массив 2-мерный , я сразу его таким объявляю. Хотя и это не принципиально
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
gregaz
Согласен, это не принципиально. Но мне не понятно одно: зачем нужен 2-х мерный массив, если все его элементы или в первой, или во-второй колонке одинаковы? Может проще делать одномерные массивы с названием массива по имени элемента, а в самом массиве только handle?
 
Верх