Ajuda algorítimo plural para singular

Olá a todos!
Venho aqui pedir uma contribuição de conhecimento para contrução de um algoritimo capaz de receber uma plural e transforma-lá em singular, como a necessidade veio agora, não tive muito tempo para compilar a ideia e comecei simples para com o tempo melhorar o código.
De começo tenho o seguinte

[code]public class trataString {

 public List<Character> vogais = Arrays.asList('a','ã','e','i','o','u');

 public String pluralSingular(String substantivo) {

      int tamanho = substantivo.length();

      //Verifica se a ultima letra do substantivo é "S"
      if(substantivo.charAt(tamanho-1) == 's') {
      
           //Verifica se a penultima letra do substantivo é uma Vogal 
           if(this.vogais.contains(substantivo.charAt(tamanho-2))) {
           
           //Se for uma vogal ele retorna a palavra apenas sem o S
           //Exemplo Singular de CARROS é CARRO

          //Agora vem a pergunta como eu retorno a palavra apenas sem o S?
          //Como eu pego a palavra e tiro apenas o S? 
           }
      }
 }

}[/code]

Se é a última letra, isso resolve:
palavra = palavra.substring (0, palavra.length() - 1);

Mas vc tem noção que vc precisaria ver algumas regras para eliminar/transformar todas as palavras com plural, para singular, certo?

Nossa Senhora, você está com dificuldades de escrever um “substring”?

Não levando em conta que você também não fez sua lição de casa e procurou as regras exatas da língua portuguesa para passar uma palavra do plural para o singular (eu acho que há tantas exceções que, na prática, eu faria uma lista gigante de palavras e usar a regra só em último caso, quando a palavra não estiver na lista), o uso de substring no seu caso é bem simples.

Digamos que a palavra seja “serviços”.

Então:

String pl = "serviços";
String sn = pl.substring (0, pl.length() - 1);

As regras são bem complicadas, a rigor. Veja um monte de palavras que não se enquadram na sua regra simples que você estipulou. Como eu disse, eu faria uma lista gigante de palavras :slight_smile:

pães -> pão
cidadãos -> cidadão
exceções -> exceção
bens -> bem
males -> mal
normais -> normal

E isso que você não está pensando nos verbos, apenas nos substantivos.

Incluindo os verbos, você vai ter mais problemas:

vendemos -> vendo
vendem -> vende
amamos -> amo
amam -> ama
partimos -> parti

Sem contar as coisas bizarras:

quaisquer -> qualquer

A primeira coisa que penso quando falam em algo dessa natureza é justamente o que o entanglement disse.
A língua portuguesa é extremamente recheada de exceções (seria a regra ser uma exceção?).
Por exemplo, no teu código você coloca lá

//Se for uma vogal ele retorna a palavra apenas sem o S  

Considere a palavra pães, a penúltima letra é uma vogal. Porém, o retorno correto não seria “pãe”, mas “pão”.
Outro caso que traria problema seria ônibus. A palavra atende à regra que você impôs, mas ninguém anda de “ônibu”.

cria uma lista de regras. p.e.

-se a palavra for igual a ‘onibus’, ou ‘quaisquer’. retorne o singular hardcode da palavra.

-senao, se a palavra termina em -ães retorna ão, -ãos retorna ão, -ões ão, e assim por diante.

-senao, se termina em -emos, retorna -o, se termina em -em retorna e.

-e em último caso, se termina em -s, retorna sem o s.

e assim voce procura todas as regras possíveis.

Hum hum hum… “temos” -> “to” ? “trem” -> “tre”?
Note que é bem mais complicado que parece.

[quote=entanglement][quote=zslnd]
-senao, se termina em -emos, retorna -o, se termina em -em retorna e.
[/quote]

Hum hum hum… “temos” -> “to” ? “trem” -> “tre”?
Note que é bem mais complicado que parece. [/quote]
A última flor do lácio é assim.
O ideal seria pegar um bom livro de gramática em que existam tais regras, aplicar cada uma e então, para cada exceção, criar uma variante.
Sem que seja assim, será impossível cobrir tudo.

Só para ter uma ideia.
Como você deve ter percebido, as regras de plural/singular para verbos são diferentes das regras de plural/singular para substantivos e adjetivos.
Portanto, a primeira coisa para fazer é determinar qual é a categoria gramatical.
O problema é que é mais fácil ter uma lista gigante de palavras que determinar a categoria gramatical assim, só de olhar a palavra (“temos” é um verbo, “Lemos” um substantivo (sobrenome), “lemos” um verbo) . Note que uma palavra, em determinadas posições da frase, pode ser um verbo (lemos) ou um substantivo (“Lemos”).

E mais uma coisa - “lemos” pode estar no passado ou no presente. Se estiver no passado, o singular é “li”. Se estiver no presente, o singular é “leio”.

Olá a todos novamente :slight_smile: gostei de ver que o fórum é bem ativo e que me deram um monte de opinião fico feliz.
A ideia de criar uma lista com todas as palavras no plural e verificar o que o usuário digita e buscar o plural nessa lista, é algo a se pensar, uma pensa que é complicado por são muitas palavras, tem que ser algo que o código seja capaz de fazer.
A respeito das regras do português eu já sabia que ia ocorrer esse problema que nem todas são iguais e tem exceções, eu criei uma classe bem simples que deve ser melhorada.

Eu pretendo tratar aquelas palavras que não se encaixam nos comparadores a baixo, criando uma lista de verbos irregulares para plural, como “Avós” ele ta na classificação de “Sem S” mas lá dentro eu verificaria se a palavra termina com S e se não esta nessa lista de verbos irregulares para assim depois fazer o singular ou pegar o singular dessa variável lista.

Esse é um desafio bem grande :slight_smile: eu até cheguei achar uma classe capaz de fazer isso mas em palavras do ingles :frowning:
Caso saia algo produtivo volto a postar o código aqui para todos.

A mais uma coisa, eu tivesse essa duvida besta de como tirar apenas o S porque sou Autodidata mas se alguém fodão tiver interessado em me ensinar tamo ai :smiley:

[code]public String pluralSingular(String substantivo) {

    int tamanho = substantivo.length();

    String singular = "";
    String auxiliar = "";
     
    auxiliar = ""+substantivo.charAt(tamanho-2)+substantivo.charAt(tamanho-1);
        
    if(auxiliar.equals("ão")) {
        return "é com ão";
    } else {

        auxiliar = ""+substantivo.charAt(tamanho-3)+substantivo.charAt(tamanho-2)+substantivo.charAt(tamanho-1);

        if(auxiliar.equals("ões")) {
            return "é com ões";
        } else {

            auxiliar = ""+substantivo.charAt(tamanho-2)+substantivo.charAt(tamanho-1);

            if(auxiliar.equals("ns")) {
                for(int i = 0; i < tamanho-2;) {
                    singular = singular+substantivo.charAt(i);
                    i++;
                }
                return singular+"m";
            } else {

                auxiliar = ""+substantivo.charAt(tamanho-1);
                if(auxiliar.equals("s")) {
                    if(this.vogais.contains(substantivo.charAt(tamanho-2))) {
                        for(int i = 0; i < tamanho-1;) {
                            singular = singular+ substantivo.charAt(i);
                            i++;
                        }
                        return singular;
                    } else {
                        return "é com apenas S";
                    }
                } else {
                    return "está pronta já";
                } } } } 
}[/code]

Que mania o de o pessoal chamar “problema” de “desafio” :slight_smile: - de qualquer forma, os plurais em inglês são realmente mais simples, porque você tem uma lista de plurais irregulares (como o de ganso, “goose” -> “geese”) e para verbos (exceto em uma lista pequena) você tem uma regra quase simples: terminou em “s”, está no presente, terceira pessoa do singular.

Português é realmente português - e antes de falar qualquer coisa, as outras línguas latinas (espanhol, italiano, francês, etc.) também são complicadas nesse ponto.

Wilson-san, só um pequeno parêntese.

A linguagem Java representa strings de uma forma terrivelmente ineficiente para a parte de concatenação (por exemplo, você escreveu uma forma de obter uma string que contém todos os caracteres de uma outra string, exceto o último, de uma forma que não é nem um pouco recomendável em código eficiente).

Em Java é necessário usar as coisas prontas (como substring) ou então, se precisar realmente montar uma string a partir de seus componentes, usar um StringBuilder.

entanglement
O código que vc e o Ironlynx postou eu não conhecia, e sabendo o que vc disse sobre desempenho e analisando que é uma forma mais simples, vou passar a utilizar, Obrigado aos 2;

palavra = palavra.substring (0, palavra.length() - 1);
String sn = pl.substring (0, pl.length() - 1);

E em relação ao desafio. Pra min desafio é aquilo que pode ser feito mais é difícil de ser alcançado ou simplesmente sinônimo para problema.