LoneWolf_2106

_ArraySearch - Return value on 2d array

10 posts in this topic

#1 ·  Posted

Hi,

i have a 2d array and i am using _ArraySearch to find the index of an array element. I store the result in a variable.

When i show  the variable, i see just a digit like "1", instead of "[1][3]" or something like that.

Can someone tell me how to get the number of row and column of the searched element?

Thanks in advance

Share this post


Link to post
Share on other sites



#2 ·  Posted

There may be better ways but if you look at the _ArraySearch function in the help file there is a 2D example.  However, it asks you for a column to search.  If you don't want to do it that way, you could modify that example and return a 2D array of row and column like this:

#include <Array.au3>
#include <MsgBoxConstants.au3>

Local $avArray[6][2] = [ _
        ["String0", "SubString0"], _
        ["String1", "SubString1"], _
        ["String2", "SubString2"], _
        ["String3", "SubString3"], _
        ["String4", "SubString4"], _
        ["String5", "SubString5"]]

_ArrayDisplay($avArray, "$avArray")

For $a=0 to UBound($avArray)-1
    $result=_ArraySearch($avArray, "String3", 0, 0, 0, 1, 1, $a) ; in this case looking for "String3"
    if $result <> 0 then
        Global $2Danswer[2]=[$result,$a] ; create 2d array with global scope to hold answer
        ExitLoop ;stop looping to preserve column number - global scope array populated with answer
    EndIf
Next

_ArrayDisplay($2Danswer)

 

1 person likes this

Build your own poker game with AutoIt: pokerlogic.au3 | Learn To Program Using FREE Tools with AutoIt

Share this post


Link to post
Share on other sites

#3 ·  Posted

A similar way. Maybe a bit faster because _ArraySearch is used only once
This is for the concept, error checkings to be added  :)

#include <Array.au3>

Local $avArray[6][2] = [ _
        ["String0", "SubString0"], _
        ["String1", "SubString1"], _
        ["String2", "SubString2"], _
        ["String3", "SubString3"], _
        ["String4", "SubString4"], _
        ["String5", "SubString5"]]
_ArrayDisplay($avArray, "$avArray")

$search = "SubString3"
Local $iIndex = _ArraySearch($avArray, $search) 
For $i = 0 to UBound($avArray, 2)-1
   If $avArray[$iIndex][$i] = $search Then $iSubIndex = $i
Next
MsgBox(0, "Found", $search & " was found in the array at position [" & $iIndex & "][" & $iSubIndex & "]")

 

Share this post


Link to post
Share on other sites

#4 ·  Posted

If you know its always going to be in the towards the last columns, maybe Binary Search with column parameter working backwards?

#include <Array.au3>

Local $avArray[6][2] = [ _
        ["String0", "SubString0"], _
        ["String1", "SubString1"], _
        ["String2", "SubString2"], _
        ["String3", "SubString3"], _
        ["String4", "SubString4"], _
        ["String5", "SubString5"]]

$search = "SubString3"

For $i = ubound($avArray , 2) - 1 to 0 step -1
$iIndex = _ArrayBinarySearch($avArray, $search , 0 , 0, $i)
If $iIndex = -1 Then
    ContinueLoop
Else
    $iIndex = "[" & $i & "]" & "[" & $iIndex & "]"
    exitloop
EndIf

Next

msgbox(0, '' , $iIndex = -1 ?  "Not Found" : $iIndex)

 


,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-.
|(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/
(_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_)
| | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) (
| | | | |)| | \ / | | | | | |)| | `--. | |) \ | |
`-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_|
'-' '-' (__) (__) (_) (__)

Share this post


Link to post
Share on other sites

#5 ·  Posted

WTAF, W.T.A.F.  ?/?

#include <Array.au3>

Local $avArray[6][2] = [ _
        ["String0", "SubString0"], _
        ["String1", "SubString1"], _
        ["String2", "SubString2"], _
        ["String3", "SubString3"], _
        ["String4", "SubString4"], _
        ["String5", "SubString5"]]


$search = "SubString3"
$str = _ArrayToString($avArray , ";" , -1 , -1 , ",")
$arr = stringregexp($str , ".*" & $search , 3)
_ArrayDisplay($arr)
msgbox(0, '' , $arr[0])

 


,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-.
|(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/
(_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_)
| | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) (
| | | | |)| | \ / | | | | | |)| | `--. | |) \ | |
`-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_|
'-' '-' (__) (__) (_) (__)

Share this post


Link to post
Share on other sites

#6 ·  Posted

I'm just going to keep talking to myself, heres one with no loop but it is confined to quite a singular purpose  :)

#include <Array.au3>

Local $avArray[6][2] = [ _
        ["String0", "SubString0"], _
        ["String1", "SubString1"], _
        ["String2", "SubString2"], _
        ["String3", "SubString3"], _
        ["String4", "SubString4"], _
        ["String5", "SubString5"]]


$search = "SubString2"

$str = _ArrayToString($avArray  , " ; " , -1 , -1 , " , ")
$sub = stringleft($str , stringinstr($str , $search) + stringlen($search))
msgbox(0, '' , "[" & stringlen(StringRegExpReplace($sub , "[^,]" , "")) & "]" & "[" & (stringregexp($sub , "\;\s" & $search  , 1) = 0 ? "0" : "1") & "]")

 

 


,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-.
|(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/
(_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_)
| | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) (
| | | | |)| | \ / | | | | | |)| | `--. | |) \ | |
`-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_|
'-' '-' (__) (__) (_) (__)

Share this post


Link to post
Share on other sites

#8 ·  Posted

iamtheky,    fou.gif

#include <Array.au3>

Local $avArray[6][2] = [ _
        ["String0", "SubString0"], _
        ["String1", "SubString1"], _
        ["String2", "SubString2"], _
        ["String3", "SubString3"], _
        ["String4", "SubString4"], _
        ["String5", "SubString5"]]

$search = "SubString3"

StringRegExpReplace(_ArrayToString($avArray , ",," , 0 , 0 , ",,"), ',+(?=.*?,' & $search & '(?=,,|$))', "")
Local $r[3] = [@extended, Floor($r[0]/UBound($avArray, 2)), $r[0]-$r[1]*UBound($avArray, 2)]
Msgbox(0,"", "[" & $r[1] & "][" & $r[2] & "]")

 

3 people like this

Share this post


Link to post
Share on other sites

#9 ·  Posted

Very nice, you are crazy good at those,

I'd like to see that put to the test against the loops, i think you may have one to dominate the races.


,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-.
|(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/
(_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_)
| | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) (
| | | | |)| | \ / | | | | | |)| | `--. | |) \ | |
`-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_|
'-' '-' (__) (__) (_) (__)

Share this post


Link to post
Share on other sites

#10 ·  Posted

Wow, it was for the fun... besides the race somehow  :D

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Similar Content

    • algiuxas
      By algiuxas
      Hello everybody, so I might found a bug in _ArraySearch:
       
      #include <Array.au3> Local $abc[2] = ["b", "b"] $h = "+---------------------------------+" & @CRLF ConsoleWrite($h) For $i = 0 To 1 $abc[0] = 0 out() $abc[0] = 1 out() $abc[0] = -1 out() $abc[0] = "Abc" out() $abc[1] = "Hello" Next Func txt() Return "$abc = [" & $abc[0] & ", " & $abc[1] & "]" & @CRLF & _ "> _ArraySearch($abc,""Hello"") = " EndFunc ;==>txt Func shouldoutput($ans) Return "_ArraySearch Should return: " & ($ans ? 1 : -1) EndFunc ;==>shouldoutput Func out() ConsoleWrite("> " & txt() & _ArraySearch($abc, "Hello") & @CRLF & "> " & shouldoutput($abc[1] == "Hello") & @CRLF & $h) EndFunc ;==>out Exit Sorry for this messy script
    • rootx
      By rootx
      . THX
      I should use _arraysearch or there is another function to be used?
      #include <Array.au3> #include <File.au3> Global Const $sFilePath = @ScriptDir&"\1.txt",$sFilePath2= @ScriptDir&"\2.txt" FileOpen($sFilePath,$FO_OVERWRITE) For $x = 1 to 10 FileWriteLine($sFilePath,$x&"test") Next FileClose($sFilePath) FileOpen($sFilePath2,$FO_OVERWRITE) For $x2 = 1 to 5 FileWriteLine($sFilePath2,$x2&"test") Next FileClose($sFilePath2) Local $aRetArray,$aRetArray2 $aArray = _FileReadToArray($sFilePath,$aRetArray) $aArray2 = _FileReadToArray($sFilePath2,$aRetArray2) If UBound($aRetArray) > UBound($aRetArray2) Then For $s = 1 To UBound($aRetArray) - 1 $search = _ArraySearch($aRetArray2, $aRetArray[$s]) If @error = 6 Then MsgBox(48, "Attention", $aRetArray[$s] & " was not found!!!") EndIf Next EndIf  
    • Shane0000
      By Shane0000
      Local $aArray_1[3] = [0,'x',2] $a1 = Execute('$aArray_' & 1 ) If @error Then Msgbox(0,@error,'Execute not working') _ArrayDisplay($a1) $i1 = _ArraySearch($a1,'y') If @error Then Msgbox(0,@error,'not working - 0') ConsoleWrite('$i1: ' & $i1 & @CRLF) $i1 = _ArraySearch($a1,'x') If @error Then Msgbox(0,@error,'not working - 1') ConsoleWrite('$i1: ' & $i1 & @CRLF) $i1 = _ArraySearch($aArray_1,'y') If @error Then Msgbox(0,@error,'not working - 2') ConsoleWrite('$i1: ' & $i1 & @CRLF) $i1 = _ArraySearch($aArray_1,'x') If @error Then Msgbox(0,@error,'not working - 3') ConsoleWrite('$i1: ' & $i1 & @CRLF) Im not sure what is going on in the above example. _ArraySearch should return a -1 if the item searched for is not found, however :
      _ArraySearch returns a 0 when searching for 'y' in the above array. [0,'x',2]
      _ArraySearch returns a 0 when searching for 'x' even tho 'x' resides in row 1
      Also referencing the $aArray_1 variable returns the same 0 from _ArraySearch both times.
      No @error codes are set off either.
      What am I missing here ? Thanks