ARRAYLIST ADDING A CLASS

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • blisspikle

    ARRAYLIST ADDING A CLASS

    The following sub form1_load reads in a text file that will say
    something like the text below. I think that the problem is that every
    time I add a class V_Sensor into the arraylist it puts it in as a
    reference. So in the end all of the arraylist items turn out to be the
    same as the last sensor in the text file. I am new and I do not know
    how to declare and put a class into an arraylist so it will be a
    different reference for every loop.


    <text>
    NAME=SENSOR1
    SLOPE=1.1
    YINTERCEPT=1.2
    NAME=SENSOR2
    SLOPE=2.1
    YINTERCEPT=2.2
    etc....
    </text>

    <code>
    Private Sub Form1_Load(ByVa l sender As System.Object, ByVal e As
    System.EventArg s) Handles MyBase.Load
    Dim V_Sensor As New AnalogSensor()
    Dim V_FileReader As StreamReader
    Dim V_TextLine As String
    Dim V_TextSplit(2) As String
    Const V_FileName As String = "HDTCHECKFIX.in i"
    V_FileReader = File.OpenText(V _FileName)
    V_TextLine = V_FileReader.Re adLine
    Do While Not V_TextLine = ""
    V_TextSplit = V_TextLine.Spli t("=")
    If V_TextSplit(0). ToUpper = "NAME" Then
    If Not V_Sensor.Name = "" Then
    AnalogSensors.A dd(V_Sensor)
    End If
    V_Sensor.Name = ""
    V_Sensor.Name = V_TextSplit(1)
    End If
    If V_TextSplit(0). ToUpper = "SLOPE" Then
    V_Sensor.Slope = V_TextSplit(1)
    End If
    If V_TextSplit(0). ToUpper = "YINTERCEPT " Then
    V_Sensor.YInter cept = V_TextSplit(1)
    End If
    V_TextLine = V_FileReader.Re adLine
    Loop
    If Not V_Sensor.Name = "" Then
    AnalogSensors.A dd(V_Sensor)
    End If
    V_Sensor.Name = ""
    V_FileReader.Cl ose()
    End Sub
    </code>

    Thank you,

  • Dennis

    #2
    RE: ARRAYLIST ADDING A CLASS

    If I read you code correctly, you are declaring V_Sensor as a new instance of
    AnalogSensor before your loop then in your loop, you are using
    AnalogSensor.Ad d(V_Sensor). I don't know what your AnalogSensor class is but
    this doesn't make any sense! Why would you add an analogsensor to itself?
    What you might have in mind is:

    Dim myArrayList as New ArrayList

    Start loop
    Dim v_Sensor as new AnalogSensor
    ......
    .....
    MyArrayList.Add (v_Sensor)
    end loop


    "blisspikle " wrote:
    [color=blue]
    > The following sub form1_load reads in a text file that will say
    > something like the text below. I think that the problem is that every
    > time I add a class V_Sensor into the arraylist it puts it in as a
    > reference. So in the end all of the arraylist items turn out to be the
    > same as the last sensor in the text file. I am new and I do not know
    > how to declare and put a class into an arraylist so it will be a
    > different reference for every loop.
    >
    >
    > <text>
    > NAME=SENSOR1
    > SLOPE=1.1
    > YINTERCEPT=1.2
    > NAME=SENSOR2
    > SLOPE=2.1
    > YINTERCEPT=2.2
    > etc....
    > </text>
    >
    > <code>
    > Private Sub Form1_Load(ByVa l sender As System.Object, ByVal e As
    > System.EventArg s) Handles MyBase.Load
    > Dim V_Sensor As New AnalogSensor()
    > Dim V_FileReader As StreamReader
    > Dim V_TextLine As String
    > Dim V_TextSplit(2) As String
    > Const V_FileName As String = "HDTCHECKFIX.in i"
    > V_FileReader = File.OpenText(V _FileName)
    > V_TextLine = V_FileReader.Re adLine
    > Do While Not V_TextLine = ""
    > V_TextSplit = V_TextLine.Spli t("=")
    > If V_TextSplit(0). ToUpper = "NAME" Then
    > If Not V_Sensor.Name = "" Then
    > AnalogSensors.A dd(V_Sensor)
    > End If
    > V_Sensor.Name = ""
    > V_Sensor.Name = V_TextSplit(1)
    > End If
    > If V_TextSplit(0). ToUpper = "SLOPE" Then
    > V_Sensor.Slope = V_TextSplit(1)
    > End If
    > If V_TextSplit(0). ToUpper = "YINTERCEPT " Then
    > V_Sensor.YInter cept = V_TextSplit(1)
    > End If
    > V_TextLine = V_FileReader.Re adLine
    > Loop
    > If Not V_Sensor.Name = "" Then
    > AnalogSensors.A dd(V_Sensor)
    > End If
    > V_Sensor.Name = ""
    > V_FileReader.Cl ose()
    > End Sub
    > </code>
    >
    > Thank you,
    >
    >[/color]

    Comment

    • blisspikle

      #3
      Re: ARRAYLIST ADDING A CLASS

      Sorry. I guess that I forgot to mention that the "ANALOGSENS ORS" that
      was used throughout the code is a public arraylist. The code below
      seems to be working quite well after I messed with it. The part that
      is different is in the arraylist using ANALOGSENSORS.A DD(NEW
      ANALOGSENSOR()) . I did not (still do not?) know how to create another
      instance of the analogsensor class for each do loop when the name in
      the text file changes.


      <code>
      Private Sub Form1_Load(ByVa l sender As System.Object, ByVal e As
      System.EventArg s) Handles MyBase.Load
      Dim V_Sensor As New AnalogSensor()
      Dim V_FileReader As StreamReader
      Dim V_TextLine As String
      Dim V_TextSplit(2) As String
      Const V_FileName As String = "HDTCHECKFIX.in i"
      V_FileReader = File.OpenText(V _FileName)
      V_TextLine = V_FileReader.Re adLine
      Do While Not V_TextLine = ""
      V_TextSplit = V_TextLine.Spli t("=")
      If V_TextSplit(0). ToUpper = "NAME" Then
      AnalogSensors.A dd(New AnalogSensor())
      V_Sensor = AnalogSensors(A nalogSensors.Co unt - 1)
      End If
      If V_TextSplit(0). ToUpper = "SLOPE" Then
      V_Sensor.Slope = V_TextSplit(1)
      End If
      If V_TextSplit(0). ToUpper = "YINTERCEPT " Then
      V_Sensor.YInter cept = V_TextSplit(1)
      End If
      V_TextLine = V_FileReader.Re adLine
      Loop
      V_FileReader.Cl ose()

      End Sub

      Public Class AnalogSensor
      Public Name As String
      Public Slope As Decimal
      Public Sub New()
      End Sub
      End Class
      </code>


      I guess the way I with that it would work is ....

      dim myclass1 as new class
      dim myarraylist1 as new arraylist
      for i = 0 to 100
      myclass1 = new class
      myarraylist1(i) .add(myclass1)
      myclass1.name = "bill " & i
      next

      My understanding is not very good yet.

      Comment

      • Michael C#

        #4
        Re: ARRAYLIST ADDING A CLASS

        Based on what you have, it appears that your file might look something like
        this:

        NAME=SENSOR1
        SLOPE=0.75
        YINTERCEPT=12
        ....

        Another option, that won't force you to implicitly cast your V_Sensor to an
        Object (when you add it to the ArrayList) and then back to a V_Sensor
        immediately is to use a counter. This works if:

        1) Every V_Sensor in your file is guaranteed to have all three entries,
        2) NAME is guaranteed to be first every time

        Also note the .Split() line - I added ", 2" to it so that it will return a
        maximum of two items when is splits your string.

        Dim V_FileReader As StreamReader
        Dim V_TextLine As String
        Dim V_TextSplit(2) As String
        Const V_FileName As String = "HDTCHECKFIX.in i"
        V_FileReader = File.OpenText(V _FileName)
        V_TextLine = V_FileReader.Re adLine
        Dim V_Sensor As New AnalogSensor
        Dim AnalogSensors As New ArrayList
        Dim Counter As Integer = 0
        Do While Not V_TextLine = ""
        V_TextSplit = V_TextLine.Spli t("=", 2)
        ' Initialize the counter to 1 when we read in the Name
        If V_TextSplit(0). ToUpper = "NAME" Then
        V_Sensor = New AnalogSensor
        V_Sensor.Name = V_TextSplit(1)
        Counter = 1
        End If
        ' Increment the counter by one.
        If V_TextSplit(0). ToUpper = "SLOPE" Then
        V_Sensor.Slope = Convert.ToDecim al(V_TextSplit( 1))
        Counter += 1
        End If
        ' Increment the counter by one. We explicitly convert the
        number to
        ' decimal here.
        If V_TextSplit(0). ToUpper = "YINTERCEPT " Then
        V_Sensor.YInter cept = Convert.ToDecim al(V_TextSplit( 1))
        Counter += 1
        End If
        ' We only add the sensor after the third item is read
        If (Counter = 3) Then
        Counter = 0
        AnalogSensors.A dd(V_Sensor)
        End If
        V_TextLine = V_FileReader.Re adLine
        Loop
        V_FileReader.Cl ose()


        "blisspikle " <eklassen@metfo rming.com> wrote in message
        news:1112663124 .398270.49690@l 41g2000cwc.goog legroups.com...[color=blue]
        > Sorry. I guess that I forgot to mention that the "ANALOGSENS ORS" that
        > was used throughout the code is a public arraylist. The code below
        > seems to be working quite well after I messed with it. The part that
        > is different is in the arraylist using ANALOGSENSORS.A DD(NEW
        > ANALOGSENSOR()) . I did not (still do not?) know how to create another
        > instance of the analogsensor class for each do loop when the name in
        > the text file changes.
        >
        >
        > <code>
        > Private Sub Form1_Load(ByVa l sender As System.Object, ByVal e As
        > System.EventArg s) Handles MyBase.Load
        > Dim V_Sensor As New AnalogSensor()
        > Dim V_FileReader As StreamReader
        > Dim V_TextLine As String
        > Dim V_TextSplit(2) As String
        > Const V_FileName As String = "HDTCHECKFIX.in i"
        > V_FileReader = File.OpenText(V _FileName)
        > V_TextLine = V_FileReader.Re adLine
        > Do While Not V_TextLine = ""
        > V_TextSplit = V_TextLine.Spli t("=")
        > If V_TextSplit(0). ToUpper = "NAME" Then
        > AnalogSensors.A dd(New AnalogSensor())
        > V_Sensor = AnalogSensors(A nalogSensors.Co unt - 1)
        > End If
        > If V_TextSplit(0). ToUpper = "SLOPE" Then
        > V_Sensor.Slope = V_TextSplit(1)
        > End If
        > If V_TextSplit(0). ToUpper = "YINTERCEPT " Then
        > V_Sensor.YInter cept = V_TextSplit(1)
        > End If
        > V_TextLine = V_FileReader.Re adLine
        > Loop
        > V_FileReader.Cl ose()
        >
        > End Sub
        >
        > Public Class AnalogSensor
        > Public Name As String
        > Public Slope As Decimal
        > Public Sub New()
        > End Sub
        > End Class
        > </code>
        >
        >
        > I guess the way I with that it would work is ....
        >
        > dim myclass1 as new class
        > dim myarraylist1 as new arraylist
        > for i = 0 to 100
        > myclass1 = new class
        > myarraylist1(i) .add(myclass1)
        > myclass1.name = "bill " & i
        > next
        >
        > My understanding is not very good yet.
        >[/color]


        Comment

        • Cor Ligthert

          #5
          Re: ARRAYLIST ADDING A CLASS

          Blispikle,

          You cannot set a class in an arraylist. You can set an instanced object in
          an arraylist.
          And because you do that now do that only one time, are you placing all the
          time the same object in your arraylist.

          As advice, forget to instance datafields in the top of your program. That is
          from the Cobol time.

          Just do (in psuedo code)
          do while reading
          Dim V_Sensor As New AnalogSensor
          V_Sensoer.whate ver = mydata
          myArraylist.Add (V_Sensoer)
          readnextone
          loop

          Now all those objects are made and not deleted because you have set a
          reference to it from the arraylist.

          And please don't use uppercases. That is called screaming in newsgroups.

          I hope this helps,

          Cor


          Comment

          Working...