Android Code Snippet PyIn() - Python 'in'

Similar threads

B4A Tutorial CharSequence / CSBuilder Tutorial
B4A Code Snippet PyRange() - Python index operator [a:b]
B4A Code Snippet PyJSON
B4A Code Snippet [B4X] Array with Redim Preserve
B4A Code Snippet Remove accents from string


Licensed User
PyIn() - Find anything in anything!! :)

Replicates the behavior of the Python keyword 'in' which returns true if something is part of something else, meaning that search is possible for:
- characters in strings
- sub-strings in strings
- characters in arrays of characters
- strings of size 1 in arrays of characters
- numbers (double, float, short, int, long) in arrays of numbers (of the same type)
- bytes in arrays of bytes
- objects in arrays of objects
- anything in lists
- anything in maps (as keys) (6.10.2. Membership test operations)

If PyIn(something, someContainer) Then
    'Do Stuff
End If
'Returns wheter or not the given object is part of the given container
Sub PyIn(obj As Object, container As Object) As Boolean
    'Is NULL part of NULL? Yes it is!
    If obj == Null And container == Null Then Return True

    'A non-NULL object may not be part of a NULL one
    If container == Null Then Return False

    'Null object workaround
    Dim oType = "java.lang.Object" As String
    If obj <> Null Then oType = GetType(obj)

    'Make sure that object is not an Array
    If oType.CharAt(0) == "[" Then Return False

    Dim cType = GetType(container) As String
    Dim isSearchInArray = cType.CharAt(0) == "[" As Boolean
    oType = oType.SubString(oType.LastIndexOf(".") + 1).CharAt(0)

    If isSearchInArray Then
        Dim cFirstChar = cType.CharAt(1) As Char
        If cFirstChar == "L" Then
            Select cType.CharAt(cType.LastIndexOf(".") + 1)
                Case "S"
                    If oType == "S" Or oType == "C" Then
                        Dim strObj = obj As String
                        Dim strCnt() = container As String
                        For Each str As String In strCnt
                            If str == strObj Then Return True
                    End If
                    Return False

                Case "O"
                    If oType == "O" Then
                        Dim objCnt() = container As Object
                        If obj == Null Then
                            For Each o As Object In objCnt
                                If o == Null Then Return True
                            For Each o As Object In objCnt
                                If o == obj Then Return True
                        End If
                    End If
                    Return False

            End Select
            Return False
        End If

        'Allow String in Char() search
        If oType == "S"       _
        And oType.Length == 1 _
        And cFirstChar == "C" Then
            Dim charObj = obj As Char
            Dim charCnt() = container As Char
            For Each c As Char In charCnt
                If c == charObj Then Return True
            Return False
        End If

        'Make sure that object is the same type as the Array
        If oType == "L" Then oType = "J"
        If oType <> cFirstChar Then Return False

        Select oType
            Case "B"
                Dim byteObj = obj As Byte
                Dim byteCnt() = container As Byte
                For Each b As Byte In byteCnt
                    If b == byteObj Then Return True

            Case "S"
                Dim shortObj = obj As Short
                Dim shortCnt() = container As Short
                For Each s As Short In shortCnt
                    If s == shortObj Then Return True

            Case "I"
                Dim intObj = obj As Int
                Dim intCnt() = container As Int
                For Each i As Int In intCnt
                    If i == intObj Then Return True

            Case "J"
                Dim longObj = obj As Long
                Dim longCnt() = container As Long
                For Each j As Long In longCnt
                    If j == longObj Then Return True

            Case "F"
                Dim floatObj = obj As Float
                Dim floatCnt() = container As Float
                For Each f As Float In floatCnt
                    If f == floatObj Then Return True

            Case "D"
                Dim doubleObj = obj As Double
                Dim doubleCnt() = container As Double
                For Each d As Double In doubleCnt
                    If d == doubleObj Then Return True

            Case "C"
                Dim charObj = obj As Char
                Dim charCnt() = container As Char
                For Each c As Char In charCnt
                    If c == charObj Then Return True

        End Select
        Return False
    End If

    Select True
        Case container Is String
            Dim strContainer = container As String
            Dim strObj = obj As String
            Return (strContainer.IndexOf(strObj) >= 0)

        Case container Is List
            Dim lst = container As List
            Return (lst.IndexOf(obj) >= 0)

        Case container Is Map
            Dim map = container As Map
            Return map.ContainsKey(obj)

    End Select
    Return False
End Sub
Test Cases:
Sub Tests
    'Expected output:
    '    - All tests should return true, meaning the result is as expected.

    'Test String in String()
        Log("01: " & (True  == PyIn("world", Array As String("hello", "world"))))
        Log("02: " & (False == PyIn("world", Array As String("hello", "universe"))))

    'Test Char in Char()
        Dim c As Char = "w"
        Log("03: " & (True  == PyIn(c, Array As Char("h", "w"))))
        Log("04: " & (False == PyIn(c, Array As Char("h", "x"))))

    'Test Char in String()
        Log("05: " & (True  == PyIn(c, Array As String("h", "w"))))
        Log("06: " & (False == PyIn(c, Array As String("h", "x"))))

    'Test String in Char()
        Log("07: " & (True  == PyIn("w", Array As Char("h", "w"))))
        Log("08: " & (False == PyIn("w", Array As Char("h", "x"))))

    'Test Object in Object()
        Dim x As Object
        Dim y As Object
        Dim z As Object = Array As Object(x)
        Log("09: " & (True  == PyIn(x, z)))
        Log("10: " & (False == PyIn(y, z)))

    'Test Byte in Byte()
        Dim b As Byte = 5
        Log("11: " & (True  == PyIn(b, Array As Byte(3, 5))))
        Log("12: " & (False == PyIn(b, Array As Byte(3, 6))))

    'Test Int in Int()
        Dim i As Int = 5
        Log("13: " & (True  == PyIn(i, Array As Int(3, 5))))
        Log("14: " & (False == PyIn(i, Array As Int(3, 6))))

    'Test Float in Float()
        Dim f As Float = 5.0
        Log("15: " & (True  == PyIn(f, Array As Float(3, 5))))
        Log("16: " & (False == PyIn(f, Array As Float(3, 6))))

    'Test Double in Double()
        Dim d As Double = 5.0
        Log("17: " & (True  == PyIn(d, Array As Double(3, 5))))
        Log("18: " & (False == PyIn(d, Array As Double(3, 6))))

    'Test Long in Long()
        Dim j As Long = 5
        Log("19: " & (True  == PyIn(j, Array As Long(3, 5))))
        Log("20: " & (False == PyIn(j, Array As Long(3, 6))))

    'Test Short in Short()
        Dim s As Short = 5
        Log("21: " & (True  == PyIn(s, Array As Short(3, 5))))
        Log("22: " & (False == PyIn(s, Array As Short(3, 6))))

    'Test something in String (incomplete number of test cases)
        Log("23: " & (True  == PyIn(s, "358")))
        Log("24: " & (False == PyIn(s, "378")))

    'Test something in List (incomplete number of test cases)
        Dim lst As List
        Log("25: " & (True  == PyIn(b, lst)))
        Log("26: " & (False == PyIn(s, lst)))
        Log("27: " & (True  == PyIn(s, lst)))

    'Test something in Map (incomplete number of test cases)
        Dim map As Map
        map.Put(j, "long")
        Log("28: " & (True  == PyIn(j, map)))
        Log("29: " & (False == PyIn(d, map)))
        map.Put(d, "double")
        Log("30: " & (True  == PyIn(d, map)))

End Sub
Last edited: