void ProcesadorConsulta::crearPosicionesNuevas(string palabra1,int posicion1, string palabra2,int posicion2, list<Posicion> & posicionesMinimas) { Posicion pos1; Posicion pos2; list<Posicion> :: iterator itPosiciones = posicionesMinimas.begin(); pos1.setPalabra(palabra1); pos1.agregarPosicion(posicion1); pos2.setPalabra(palabra2); pos2.agregarPosicion(posicion2); bool encontrado = false; list<Posicion> actuales1; list<Posicion> actuales2; if(posicionesMinimas.size() > 0) { //Agrego todos los elementos en mi nueva lista while(itPosiciones != posicionesMinimas.end()) { Posicion posicionActual = *itPosiciones; list<int> pos; if(posicionActual.getPalabra() == palabra1) { pos.push_back(posicion1); posicionActual.agregarPosiciones(pos); encontrado = true; } actuales1.push_back(posicionActual); itPosiciones++; } if(!encontrado) actuales1.push_back(pos1); encontrado = false; itPosiciones = actuales1.begin(); while(itPosiciones != actuales1.end()) { Posicion posicionActual = *itPosiciones; list<int> pos; if(posicionActual.getPalabra() == palabra2) { pos.push_back(posicion2); posicionActual.agregarPosiciones(pos); encontrado = true; } actuales2.push_back(posicionActual); itPosiciones++; } if(!encontrado) actuales2.push_back(pos2); posicionesMinimas.clear(); itPosiciones = actuales2.begin(); while(itPosiciones != actuales2.end()) { Posicion actual = *itPosiciones; posicionesMinimas.push_back(actual); itPosiciones++; } } else { posicionesMinimas.push_back(pos1); posicionesMinimas.push_back(pos2); } }
Posicion ProcesadorConsulta::compararPosiciones(Posicion posicionActual, Posicion posicionSiguiente, list<Posicion> & posicionesMinimas) { list<int> posiciones1 = posicionActual.getPosiciones(); list<int> posiciones2 = posicionSiguiente.getPosiciones(); list<int> :: iterator itPosiciones1 = posiciones1.begin(); list<int> :: iterator itPosiciones2; int distanciaMinima = 0; int distanciaMinimaAnterior = 0; Posicion posicionMinima; while(itPosiciones1!= posiciones1.end()) { int pos1Actual = *itPosiciones1; itPosiciones2 = posiciones2.begin(); while(itPosiciones2 != posiciones2.end()) { int pos2Actual = *itPosiciones2; if(pos1Actual < pos2Actual) { distanciaMinima = abs(pos2Actual - pos1Actual); if(distanciaMinimaAnterior == 0) distanciaMinimaAnterior = distanciaMinima; if(distanciaMinima < distanciaMinimaAnterior) { distanciaMinimaAnterior = distanciaMinima; posicionesMinimas.clear(); crearPosicionesNuevas(posicionActual.getPalabra(),pos1Actual,posicionSiguiente.getPalabra(),pos2Actual,posicionesMinimas); } else if(distanciaMinima == distanciaMinimaAnterior) crearPosicionesNuevas(posicionActual.getPalabra(),pos1Actual,posicionSiguiente.getPalabra(),pos2Actual,posicionesMinimas); } itPosiciones2++; } itPosiciones1++; } list<Posicion> :: iterator itPosicionesMinimas = posicionesMinimas.begin(); bool encontrado = false; while(itPosicionesMinimas != posicionesMinimas.end() && !encontrado) { Posicion posicionActual = *itPosicionesMinimas; if(posicionActual.getPalabra() == posicionSiguiente.getPalabra()) { posicionMinima = posicionActual; encontrado = true; } itPosicionesMinimas++; } return posicionMinima; }