Ando às voltas com isto mas, … não chego lá.
Propus-me fazer um programa (contador) que gere sequências de zero a alguns milhões! Apesar da minha ignorância, se o pensei assim o fiz! Só que deparei-me com um GRANDE problema uma das condições é a eliminação de algumas sequências por exemplo eliminar “11111”. Bem eliminar 11111, numa linha de 5 digitos consigo, o problema é que eu pretendo trabalhar com linhas de 12 ou 16 digitos e não é de forma alguma exequivel declarar esta variável exacta para eliminar / saltar, uma vez que se pode encontrar entre a posição 0 e 11 ou entre 0 e 15, trabalhando eu com linhas de 12 ou 16 digitos, a menos que, e ainda assim complicado, exista forma de declarar caracteres incógnitos do tipo ???11111???, em que o programa ao correr se centre apenas em 11111 esquecendo os digitos que se encontrem antes e depois da varível. Será que existe esta possibilidade?
Uma outra possibilidade, julgo eu, seria usar uma matriz uma vez que aqui eu tenho posições, então já poderia usar (penso eu) <<se entre a posição “x” e “y” “a” for igual a “b” faça>>, só que, apesar de perceber o que é uma matriz, não estou a conseguir pô-la em prática, para depois se for possivel fazer correr o contador dentro da própria matriz? Pode-se fazer correr o contador dentro da matriz? Como não sei concretamente quantas linhas terei que usar (basta fazer as contas) posso omitir a quantidade de linhas? Espero ter-me feito entender, para que possa ser esclarecido. Obrigado.
Camarada até tem como você fazer a primeira opção, mas você vai precisar converter seu numero para String para verifica-lo utilizando expressão regular!! De uma pesquisada em expressão regular…
Quais são os tipos de seqüências que você quer eliminar? Você quer impedir que um número (111111) seja gerado ou você quer impedir que uma seqüência de números (1, 1, 1, 1, 1, 1) seja gerada?
Se for a primeira (um número contendo dígitos repetidos ser gerado) pode-se gerar o tal número, convertê-lo para uma string, e submetê-lo a uma expressão regular, que irá filtrá-lo.
Por exemplo, se quiser impedir que um número tenha 4 algarismos iguais consecutivos, não importando onde:
import java.util.*;
import java.util.regex.*;
class PadraoAlgarismosRepetidos {
public static void main (String[] args) {
long[] numeros = {
123456789L,
122222123L,
123333311L,
977771222L,
31415926L
};
Pattern pat = Pattern.compile ("(\d)\1{3,}");
for (int i = 0; i < numeros.length; ++i) {
String numero = Long.toString (numeros[i]);
if (pat.matcher (numero).find()) {
System.out.println ("O numero " + numero + " tem pelo menos 4 algarismos repetidos, e deve ser recusado");
} else {
System.out.println ("O numero " + numero + " esta OK");
}
}
}
}
Para melhor explicação do que peretendo é o seguinte.
se durante a geração de números ou sequências ocorrer:
0001111099
0001111100 esta sequência ou número deve ser evitada ou seja salta para o numero imediatamente a seguir, onde não existam mais que 4 digitos seguidos.
0001111200
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
O programa deu os seguintes erros que julgo seja falta de qualquer coisa:
daddy@localhost JavaTeste]$ javac repet.java
[daddy@localhost JavaTeste]$ java repet
Exception in thread “main” java.lang.NoClassDefFoundError: repet
Caused by: java.lang.ClassNotFoundException: repet
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:336)
Could not find the main class: repet. Program will exit.
[daddy@localhost JavaTeste]$
Porque o programa não correu e o meu desconhecimento não me permite saber o porquê, não posso dizer que a sua enorme boa vontade tenha satisfeito o meu desejo, no entanto ao olhar para o programa fiquei com uma dúvida (?). O programa da forma como está estruturado apenas analisa os números indicados rejeitando os que não obedecem aos requesitos ou digamos que “numeros” será o nome do programa que gera as sequências e o restante bloco do programa analisará os numeros e elimina / salta as sequência indesejáveis? Obrigado pela atenção.
Rode o programa com “java -cp . repet”.
É que o java não procura as classes no diretório corrente se você não o especificar explicitamente.
O programa que postei define um array “numeros” já inicializado com alguns números, e o percorre do início ao fim mostrando quais desses números têm 4 algarismos repetidos ou mais.
O que equivale por assim dizer que não serve os meus intentos, uma vez que não é funcional criar um array com alguns milhões de sequencias. Correcto? Obrigado na mesma!
O array é só pra testes. Entenda como o programa funciona e o edite para p/ o teu caso.
Já encontrei o erro não há necessidade de usar java -cp, tratava-se apenas de um erro de principiante, não gravei o projecto com o nome da classe.
Mas constatei um pequeno problema nos testes. Adicionei algumas sequências ao array e esta 0000007564L e ao correr o programa devolve-me o numero 3956 esta OK. Porque é que para além de aceitar o numero quando tem 6 zeros altera de 7564 para 3956. Também constatei que ao inserir 2 zeros (00) se a seguir inserir o nº 8 ou 9 este não ficam na cor dourada, fica perto e o programa dá erro. Obrigado!
Já percebi porquê, ainda que não saiba como corrigir, mas tem a ver com numeros octais 3956 é a conversão para octal do número decimal 7564 e a numeração octal não comporta o nº 8 e 9. Como é que corrijo isto?