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?
}
}
}
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.
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
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
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”.
[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 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 eu até cheguei achar uma classe capaz de fazer isso mas em palavras do ingles
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
Que mania o de o pessoal chamar “problema” de “desafio” - 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.
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;