Foros del Web » Programación para mayores de 30 ;) » .NET »

Ayuda con búsquedas en Arraylist - Visual Basic 2005

Estas en el tema de Ayuda con búsquedas en Arraylist - Visual Basic 2005 en el foro de .NET en Foros del Web. Hola a todos, He buscado, pero no he encontrado nada que me ayude. Estoy estudiando Visual Basic y debo hacer un ejercicio, en el que ...
  #1 (permalink)  
Antiguo 10/06/2010, 09:16
 
Fecha de Ingreso: diciembre-2008
Mensajes: 13
Antigüedad: 15 años, 4 meses
Puntos: 0
Pregunta Ayuda con búsquedas en Arraylist - Visual Basic 2005

Hola a todos,

He buscado, pero no he encontrado nada que me ayude.

Estoy estudiando Visual Basic y debo hacer un ejercicio, en el que me encuentro con el siguiente problema:

Tengo que buscar en un ArrayList de estructuras. La estructura es:

Private Structure TEmpleado
Public nombre As String
Public ventas As ArrayList
End Structure

En un principio, sin introducir nada dentro de ventas, me ha funcionado la siguiente función:

Private Function buscarempleado(ByRef arrayempleados As ArrayList) As Integer
Dim cache As TEmpleado

cache.nombre = InputBox("Escriba el nombre del empleado que desea buscar", "Búsqueda") 'Pedimos el nombre a buscar, y lo guardamos en caché.
If arrayempleados.Contains(cache) Then 'Si el array contiene el valor que se busca
Return arrayempleados.IndexOf(cache) 'Devolvemos su posición.
Else
MessageBox.Show("Empleado no encontrado", "Error")
Return -1 'si no, devolvemos un -1
End If
End Function

Cuando he introducido las ventas, la función ya no funciona. Entiendo que es porque busca una entrada del arraylist que coincida tanto en nombre como en ventas, y esto ya no se cumple.

Existe alguna manera de usar Contains para que me busque solo teniendo en cuenta el nombre?, alguna sugerencia?.

Gracias y saludos,

Buckcherry
  #2 (permalink)  
Antiguo 10/06/2010, 09:39
 
Fecha de Ingreso: diciembre-2008
Mensajes: 13
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Ayuda con búsquedas en Arraylist - Visual Basic 2005

Tras un poco de Brainstorming he encontrado la solución .
Por si a alguien le interesa, lo he hecho así.

Private Function buscarempleado(ByRef arrayempleados As ArrayList) As Integer
Dim cache As String
Dim i As Integer

cache = InputBox("Escriba el nombre del empleado que desea buscar", "Búsqueda") 'Pedimos el nombre a buscar, y lo guardamos en caché.

For i = 0 To arrayempleados.Count
If arrayempleados(i).nombre = cache Then
Return i
End If
Next
End Function

Agradezco igualmente sugerencias, consejos, opiniones... pero no me urgen.

Gracias a todos.
  #3 (permalink)  
Antiguo 10/06/2010, 10:08
 
Fecha de Ingreso: diciembre-2008
Mensajes: 13
Antigüedad: 15 años, 4 meses
Puntos: 0
Pregunta Respuesta: Ayuda con búsquedas en Arraylist - Visual Basic 2005

Bueno, esto parece un monólogo...

Lo he pulido un poco, pero ahora me surge otro problema:

Private Function buscarempleado(ByRef arrayempleados As ArrayList) As Integer
Dim cache As String 'Creamos una variable tipo String para guardar el nombre a buscar
Dim i As Integer 'Creamos una variable contador

cache = InputBox("Escriba el nombre del empleado que desea buscar", "Búsqueda") 'Pedimos el nombre a buscar, y lo guardamos en memoria.
MessageBox.Show(arrayempleados.Count())
For i = 0 To arrayempleados.Count 'Recorremos el array en busca
If arrayempleados(i).nombre = cache Then
Return i
Else
MessageBox.Show("Empleado no encontrado.", "No encontrado")
Return -1
End If
Next
End Function

Si el array está vacío me sale una excepción:

No se controló ArgumentOutOfRangeException
El índice estaba fuera del intervalo. Debe ser un valor no negativo e inferior al tamaño de la colección.
Nombre del parámetro: index

Alguna idea?
  #4 (permalink)  
Antiguo 10/06/2010, 10:21
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Ayuda con búsquedas en Arraylist - Visual Basic 2005

Traslado el tema a una sección donde encaja mejor.

Así sin revisar detenidamente. El bucle debería terminar en Count - 1:
Código vb.net:
Ver original
  1. For i = 0 To arrayempleados.Count - 1
  2.     ' Código
  3. Next i
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #5 (permalink)  
Antiguo 10/06/2010, 10:43
 
Fecha de Ingreso: diciembre-2008
Mensajes: 13
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Ayuda con búsquedas en Arraylist - Visual Basic 2005

Cita:
Iniciado por David Ver Mensaje
Traslado el tema a una sección donde encaja mejor.

Así sin revisar detenidamente. El bucle debería terminar en Count - 1:
Código vb.net:
Ver original
  1. For i = 0 To arrayempleados.Count - 1
  2.     ' Código
  3. Next i
Asumiendo que soy un principiante, basandome en lo que creo saber...
Count no cuenta a partir de 0, sino de 1...

Si en el array hay dos valores, count da como resultado 2
Si recorro el array con Count - 1 no me encuentra el valor que está en la última posición.

...pero me has ayudado mucho , porque me he dado cuenta que cuando el array está vacío Count da como resultado 0

Por lo que, ahora si:

Private Function buscarempleado(ByRef arrayempleados As ArrayList) As Integer
Dim cache As String 'Creamos una variable tipo String para guardar el nombre a buscar
Dim i As Integer 'Creamos una variable contador

cache = InputBox("Escriba el nombre del empleado que desea buscar", "Búsqueda") 'Pedimos el nombre a buscar, y lo guardamos en memoria.
If arrayempleados.Count() <> 0 Then 'Si el arraylist no está vacío
For i = 0 To arrayempleados.Count 'Recorremos el array
If arrayempleados(i).nombre = cache Then 'Si hay una coincidencia
Return i 'Devolvemos donde está ubicada
Else
MessageBox.Show("Empleado no encontrado.", "No encontrado") 'Si no lo encontramos...
Return -1 'devolvemos un -1
End If
Next
Else 'Si el arraylist está vacío
Return -1 'Devolvemos -1
MessageBox.Show("Empleado no encontrado.", "No encontrado") '...y sacamos mensaje por pantalla.
End If
End Function

Esto ya funciona.
Gracias de nuevo a todos, y en particular a David
  #6 (permalink)  
Antiguo 10/06/2010, 11:52
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Ayuda con búsquedas en Arraylist - Visual Basic 2005

Pero los índices empiezan con 0:
Cita:
Elements in this collection can be accessed using an integer index. Indexes in this collection are zero-based.
Véase: http://msdn.microsoft.com/en-us/libr...arraylist.aspx

Por lo que si tienes 2 elementos (Count = 2), los índices serán 0 y 1.
Además, fíjate que en el bucle siempre vas a comparar sólo con el primer elemento. Ya que si coincide devuelves un valor, y si no coincide (aún antes de comparar con los demás elementos del ArrayList) muestras el mensaje de error y devuelves -1.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #7 (permalink)  
Antiguo 10/06/2010, 12:13
 
Fecha de Ingreso: diciembre-2008
Mensajes: 13
Antigüedad: 15 años, 4 meses
Puntos: 0
Fe de Erratas: Ayuda con búsquedas en Arraylist - Visual Basic 2005

Cita:
Iniciado por buckcherry Ver Mensaje
Asumiendo que soy un principiante, basandome en lo que creo saber...
Count no cuenta a partir de 0, sino de 1...

Si en el array hay dos valores, count da como resultado 2
Si recorro el array con Count - 1 no me encuentra el valor que está en la última posición.

...pero me has ayudado mucho , porque me he dado cuenta que cuando el array está vacío Count da como resultado 0

Por lo que, ahora si:

Private Function buscarempleado(ByRef arrayempleados As ArrayList) As Integer
Dim cache As String 'Creamos una variable tipo String para guardar el nombre a buscar
Dim i As Integer 'Creamos una variable contador

cache = InputBox("Escriba el nombre del empleado que desea buscar", "Búsqueda") 'Pedimos el nombre a buscar, y lo guardamos en memoria.
If arrayempleados.Count() <> 0 Then 'Si el arraylist no está vacío
For i = 0 To arrayempleados.Count 'Recorremos el array
If arrayempleados(i).nombre = cache Then 'Si hay una coincidencia
Return i 'Devolvemos donde está ubicada
Else
MessageBox.Show("Empleado no encontrado.", "No encontrado") 'Si no lo encontramos...
Return -1 'devolvemos un -1
End If
Next
Else 'Si el arraylist está vacío
Return -1 'Devolvemos -1
MessageBox.Show("Empleado no encontrado.", "No encontrado") '...y sacamos mensaje por pantalla.
End If
End Function

Esto ya funciona.
Gracias de nuevo a todos, y en particular a David
Tenías razón, David, y yo te la di sin dartela .
Count cuenta a partir de 1, con lo que hay que restarselo para que se iguale con el índice...
Por otra parte, había metido un Else dentro del bucle que lo frenaba.
El código definitivo es este:

Private Function buscarempleado(ByRef arrayempleados As ArrayList) As Integer
Dim cache As String 'Creamos una variable tipo String para guardar el nombre a buscar
Dim i As Integer 'Creamos una variable contador
If arrayempleados.Count <> 0 Then 'Si el arraylist no está vacío
cache = InputBox("Escriba el nombre del empleado que desea buscar", "Búsqueda") 'Pedimos el nombre a buscar, y lo guardamos en memoria.

For i = 0 To arrayempleados.Count - 1 'Recorremos el array
If arrayempleados(i).nombre = cache Then 'Si hay una coincidencia
Return i 'Devolvemos donde está ubicada
End If
Next
MessageBox.Show("Empleado no encontrado.", "No encontrado") 'Si no lo encontramos...
Return -1 'devolvemos un -1
Else 'Si el arraylist está vacío
MessageBox.Show("No hay empleados.", "Error") '...y sacamos mensaje por pantalla.
Return -1 'Devolvemos -1
End If
End Function
  #8 (permalink)  
Antiguo 10/06/2010, 12:18
 
Fecha de Ingreso: diciembre-2008
Mensajes: 13
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Ayuda con búsquedas en Arraylist - Visual Basic 2005

Hemos escrito a la vez... Si, yo me estaba refiriendo a Count. Si hay un valor en el arraylist, está en la posición 0, pero count te devuelve 1 (1 elemento).
Olvídalo, no tengo práctica ni se demasiado y cuando estoy muchas horas aquí delante me espeso... . Gracias

Etiquetas: arraylist, basic, visual
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:42.