Comunidad Gambas-es
Coincidencias con multiples elementos - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forum-3.html)
+--- Foro: Aplicaciones/Fragmentos de Código (https://gambas-es.org/forum-8.html)
+--- Tema: Coincidencias con multiples elementos (/thread-1013.html)



Coincidencias con multiples elementos - tincho - 02-09-2022

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.
Código:
cRecipes["R1"] = ["tomate": 400, "harina": 1000, "sal": 12, "levadura": 42, "agua": 400]
cRecipes["R2"] = ["harina": 5000, "sal": 12, "levadura": 42, "agua": 400]

  aRecipes = ["tomate", "harina", "sal", "levadura", "agua"]
...
  aRecipes = ["cebolla", "sal", "tomate", "aceite"]
  ...
  aRecipes = ["ingrediente-1", "ingrediente-2", "ingrediente-n"]
  

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?


RE: Coincidencias con multiples elementos - Shordi - 02-09-2022

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


RE: Coincidencias con multiples elementos - cogier - 03-09-2022

¿Ayuda esto?
Código:
Public Sub Form_Open()

  Dim aRecipes As String[]

  cRecipes["R1"] = ["tomate": 400, "harina": 1000, "sal": 12, "levadura": 42, "agua": 400]
  cRecipes["R2"] = ["harina": 5000, "sal": 12, "levadura": 42, "agua": 400]

  Search(["tomate", "harina", "sal", "levadura", "agua"])
  Search(["cebolla", "sal", "tomate", "aceite"])
  Search(["ingrediente-1", "ingrediente-2", "ingrediente-n"])
  Search(["harina", "sal", "levadura", "agua"])

End

Public Sub Search(aRecipes As String[])

  Dim sCol, sRep, sReturn As String
  Dim iMatch As Integer
  Dim iLen As Integer

  For Each sCol In cRecipes.Keys
    Print sCol & " - ";
    iMatch = 0
    iLen = cRecipes[sCol].Count
    For Each sRep In cRecipes[sCol]
      If aRecipes.Find(cRecipes[sCol].Key) <> -1 Then Inc iMatch
    Next
    Print Str(iMatch) & " de " & Str(iLen) & " = " & Str((iMatch / iLen) * 100) & "%"
  Next

  Print

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%


RE: Coincidencias con multiples elementos - tincho - 03-09-2022

(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.


RE: Coincidencias con multiples elementos - tincho - 04-09-2022

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.