tincho   02-09-2022, 14:38
#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.
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?
Última modificación: 02-09-2022, 14:41 por tincho.

1 Saludo.
Shordi   02-09-2022, 19:13
#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
cogier   03-09-2022, 18:18
#3
¿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%
tincho   03-09-2022, 19:16
#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.
Última modificación: 03-09-2022, 19:40 por tincho.

1 Saludo.
tincho   04-09-2022, 11:26
#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.
  
Usuarios navegando en este tema: 1 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.