Android Code Snippet PyIn() - Python 'in'

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)
https://docs.python.org/3/reference/expressions.html (6.10.2. Membership test operations)

Usage:
Code: Copy
If PyIn(something, someContainer) Then
    'Do Stuff
End If

Snippet:
Code: Copy
'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
                        Next
                    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
                            Next
                        Else
                            For Each o As Object In objCnt
                                If o == obj Then Return True
                            Next
                        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
            Next
            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
                Next

            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
                Next

            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
                Next

            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
                Next

            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
                Next

            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
                Next

            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
                Next

        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:
Code: Copy
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
        lst.Initialize
        lst.Add(x)
        lst.add("5")
        lst.add(5)
        lst.add(b)
        Log("25: " & (True  == PyIn(b, lst)))
        Log("26: " & (False == PyIn(s, lst)))
        lst.add(s)
        Log("27: " & (True  == PyIn(s, lst)))

    'Test something in Map (incomplete number of test cases)
        Dim map As Map
        map.Initialize
        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:
Back
Top