Algoritmo para tratamento de homônimos (cadastros duplicados) - Ajuda

1 resposta
T

A idéia do algoritmo é criar uma lista com possíveis homônimos (para duplicidade de cadastros devido a erro de digitação), para busca em SQL em um sistema, estou com problema na geração destas possíveis palavras, o algoritmo abaixo traz o exemplo de gonsalves, a idéia é que ele produza.: gonsalves, jonsalves, gunsalves, junsalves, gomsalves, jumsalves, … . Seria uma facilidade para busca em banco de dados, já que os mesmos não aceitam regex ou pelo menos desconheço um meio. A lista de caracteres a substituir virá de um banco de dados e não de um List como no algoritmo abaixo. Alguém poderia me dar uma mão? O algoritmo abaixo está produzindo letras duplicadas e faltando letras no percorrer da palavra. O que estou fazendo de errado? Tentei de diversas formas.

Classe Main.java

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {

        List<Homonimo> homonimos = new ArrayList();

        homonimos.add(new Homonimo("s", "ss"));
        homonimos.add(new Homonimo("s", "ç"));
        homonimos.add(new Homonimo("s", "z"));
        homonimos.add(new Homonimo("s", "sc"));
        homonimos.add(new Homonimo("s", "s"));

        homonimos.add(new Homonimo("ç", "s"));
        homonimos.add(new Homonimo("ç", "ss"));
        homonimos.add(new Homonimo("ç", "ç"));
        homonimos.add(new Homonimo("ç", "z"));
        homonimos.add(new Homonimo("ç", "sc"));

        homonimos.add(new Homonimo("z", "s"));
        homonimos.add(new Homonimo("z", "ss"));
        homonimos.add(new Homonimo("z", "ç"));
        homonimos.add(new Homonimo("z", "z"));
        homonimos.add(new Homonimo("z", "sc"));

        homonimos.add(new Homonimo("l", "ll"));
        homonimos.add(new Homonimo("l", "u"));
        homonimos.add(new Homonimo("l", "l"));

        homonimos.add(new Homonimo("u", "l"));
        homonimos.add(new Homonimo("u", "ll"));
        homonimos.add(new Homonimo("u", "u"));

        homonimos.add(new Homonimo("v", "w"));
        homonimos.add(new Homonimo("v", "v"));

        homonimos.add(new Homonimo("o", "o"));
        homonimos.add(new Homonimo("o", "u"));

        homonimos.add(new Homonimo("u", "u"));
        homonimos.add(new Homonimo("u", "o"));

        homonimos.add(new Homonimo("g", "g"));
        homonimos.add(new Homonimo("g", "j"));

        homonimos.add(new Homonimo("j", "j"));
        homonimos.add(new Homonimo("j", "g"));

        homonimos.add(new Homonimo("m", "m"));
        homonimos.add(new Homonimo("m", "mm"));
        homonimos.add(new Homonimo("m", "n"));

        homonimos.add(new Homonimo("n", "n"));
        homonimos.add(new Homonimo("n", "m"));
        homonimos.add(new Homonimo("n", "nn"));

        homonimos.add(new Homonimo("i", "i"));
        homonimos.add(new Homonimo("i", "y"));

        homonimos.add(new Homonimo("y", "i"));
        homonimos.add(new Homonimo("y", "y"));

        String homonimo = "gonsalves";
        
        List<String> hs = new ArrayList();

        String palavra = "";
        String palavraParcial = "";

        hs.add(homonimo);

        for (int i = 0; i < homonimo.length(); i++) {

            for (Homonimo h : homonimos) {

                if (h.caracter.equals(homonimo.charAt(i) + "")) {
                    int tam = hs.size();
                    for (int j = 0; j < tam; j++) {
                        palavraParcial = hs.get(j).substring(0, i);
                        palavraParcial += h.valor;

                        if ((hs.get(j).length() - i) <= 0) {
                            if (h.valor.length() == 2) {
                                palavraParcial += hs.get(j).substring(i + (hs.get(j).length() - i) + 2, homonimo.length());
                            } else {
                                palavraParcial += hs.get(j).substring(i + (hs.get(j).length() - i) + 1, homonimo.length());
                            }
                        } else {
                            palavraParcial += hs.get(j).substring(i + 1, homonimo.length());
                        }

                        System.out.println(palavraParcial);
                        hs.add(palavraParcial);

                    }
                }

                for (int l = 0; l < hs.size(); l++) {
                    palavra = hs.get(l);
                    int k = l;
                    int tam = hs.size();
                    while (k < tam) {
                        k++;
                        if (k < hs.size()) {
                            if (palavra.equals(hs.get(k).toString())) {
                                k--;
                                tam--;
                                hs.remove(k);
                            }
                        }
                    }

                }


            }

            System.out.println(hs);
            System.out.println(hs.size());
        }
        System.out.println(hs);
        System.out.println(hs.size());

    }
}

Classe Homonimo.java

public class Homonimo {
    
    String caracter;
    String valor;

    public Homonimo(String caracter, String valor) {
        this.caracter = caracter;
        this.valor = valor;
    }

    
    
    public String getCaracter() {
        return caracter;
    }

    public void setCaracter(String caracter) {
        this.caracter = caracter;
    }

    public String getValor() {
        return valor;
    }

    public void setValor(String valor) {
        this.valor = valor;
    }
}

Saída

[gonsalves, jonsalves, gunsalves, junsalves, gomsalves, jomsalves, gumsalves, jumsalves, gonssavve, jonssavve, gunssavve, junssavve, gomssavve, …

Utilizando Netbeans, JDK 7.

1 Resposta

InicianteJavaHenriqu

A classe Homonimo poderia ser um Map (não resolve o problema citado no tópico, mas reduz código): http://docs.oracle.com/javase/6/docs/api/java/util/Map.html

Criado 3 de maio de 2012
Ultima resposta 3 de mai. de 2012
Respostas 1
Participantes 2