Este foro usa cookies
Este foro utiliza cookies para almacenar su información de inicio de sesión si está registrado y su última visita si no lo está. Las cookies son pequeños documentos de texto almacenados en su computadora; las cookies establecidas por este foro solo se pueden usar en este sitio web y no representan ningún riesgo de seguridad. Las cookies en este foro también rastrean los temas específicos que ha leído y la última vez que los leyó. Si Ud. continúa navegando, entenderemos que acepta todas las cookies.

Se almacenará una cookie en su navegador, independientemente de la elección, para evitar que se le vuelva a hacer esta pregunta. Podrá cambiar la configuración de sus cookies en cualquier momento utilizando el enlace en el pie de página.

El foro antiguo se encuentra accesible desde https://foro.gambas-es.org en modo de solo lectura.

Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

Coincidencias con multiples elementos
#1

Hola.
En el ejemplo de mas abajo hay una colección de recetas llamadas R1 y R2 pero imaginen que son miles.
Luego hay una lista String[] que en un loop va cambiando los integrantes y en cada pasada deseo saber si la lista "temporal" de ingredientes coincide con alguna "receta" de la colección, es decir si los ítemes de la lista String[] coinciden con los indices de la colección secundaria R1 R2 ... Rn.
GAMBAS
  1. cRecipes["R1"] = ["tomate": 400, "harina": 1000, "sal": 12, "levadura": 42, "agua": 400]
  2. cRecipes["R2"] = ["harina": 5000, "sal": 12, "levadura": 42, "agua": 400]
  3.  
  4.   aRecipes = ["tomate", "harina", "sal", "levadura", "agua"]
  5. ...
  6.   aRecipes = ["cebolla", "sal", "tomate", "aceite"]
  7.   ...
  8.   aRecipes = ["ingrediente-1", "ingrediente-2", "ingrediente-n"]
  9.   



Deseo saber si existe coincidencia 100% o un porcentaje, por ejemplo la receta del "pan" coincidiría con la receta de la pizza en algunos de sus ingredientes (las cantidades de momento no me interesan).

¿Cómo lo harían?

1 Saludo.
    ¡Gracias!
#2

Entiendo lo que quieres hacer y sin entrar a responder a tu pregunta apunto lo que yo haría:
El recetario estará guardado en
a) una base de datos -> deja que sea la BBDD la que decida vía SQL
o
b) una serie de archivos txt, csv, json o lo que sea. -> haz la comparación vía funciones de cadena sobre el texto "a lo bruto" directamente.

La solución b es muy tosca, pero debería ser más rápida pues te ahorra todo el mecanismo file a collection a función de búsqueda.

Saludos

No podemos regresar
[-] Los siguientes 1 usuarios dice gracias a Shordi por este post:
  • tincho
    ¡Gracias!
#3

¿Ayuda esto?
GAMBAS
  1. cRecipes As Collection = ["R1": 0, "R2": 1]
  2.  
  3. Public Sub Form_Open()
  4.  
  5.   Dim aRecipes As String[]
  6.  
  7.   cRecipes["R1"] = ["tomate": 400, "harina": 1000, "sal": 12, "levadura": 42, "agua": 400]
  8.   cRecipes["R2"] = ["harina": 5000, "sal": 12, "levadura": 42, "agua": 400]
  9.  
  10.   Search(["tomate", "harina", "sal", "levadura", "agua"])
  11.   Search(["cebolla", "sal", "tomate", "aceite"])
  12.   Search(["ingrediente-1", "ingrediente-2", "ingrediente-n"])
  13.   Search(["harina", "sal", "levadura", "agua"])
  14.  
  15.  
  16. Public Sub Search(aRecipes As String[])
  17.  
  18.   Dim sCol, sRep, sReturn As String
  19.   Dim iMatch As Integer
  20.   Dim iLen As Integer
  21.  
  22.   For Each sCol In cRecipes.Keys
  23.     Print sCol & " - ";
  24.     iMatch = 0
  25.     iLen = cRecipes[sCol].Count
  26.     For Each sRep In cRecipes[sCol]
  27.       If aRecipes.Find(cRecipes[sCol].Key) <> -1 Then Inc iMatch
  28.     Next
  29.     Print Str(iMatch) & " de " & Str(iLen) & " = " & Str((iMatch / iLen) * 100) & "%"
  30.   Next
  31.  



Resultados: -
R1 - 5 de 5 = 100%
R2 - 4 de 4 = 100%

R1 - 2 de 5 = 40%
R2 - 1 de 4 = 25%

R1 - 0 de 5 = 0%
R2 - 0 de 4 = 0%

R1 - 4 de 5 = 80%
R2 - 4 de 4 = 100%
[-] Los siguientes 2 usuarios dicen gracias a cogier por este post:
  • Shell, tincho
    ¡Gracias!
#4

(03-09-2022, 18:18)cogier escribió:  ¿Ayuda esto?

Creo que si, voy a probarlo pero por lo que veo soluciona el problema.

(02-09-2022, 19:13)Shordi escribió:  a) una base de datos -> deja que sea la BBDD la que decida vía SQL
b) una serie de archivos txt, csv, json o lo que sea. -> haz la comparación vía funciones de cadena sobre el texto "a lo bruto" directamente.

Sí, es algo mixto, existe una base de datos (el recetario) en la que están las "recetas". Luego hay una serie de archivos de texto que contienen una o varias "recetas" que pueden coincidir o no con lo que esté en el recetario, pero en el caso que coincidan el algoritmo le asigna una "receta" del recetario y en caso que no, propone agregar la receta poniendo la información en un formulario para crearlas.

1 Saludo.
    ¡Gracias!
#5

Cogier, funciona perfectamente, muchas gracias.
Hice un cambio en el orden de subcolecciones de cRecipes para que estén primero las colecciones con mas componentes, de modo que tengan prioridad en la comparación, ya que una vez asignada una receta base esos ítemes dejan de estar en la lista de comparación.

1 Saludo.
    ¡Gracias!


Posibles temas similares…
Tema / Autor Respuestas Vistas Último mensaje

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)