E ai pessoal, é o seguinte, to tentando faze uma função que recebe uma string como argumento e retorna um inteiro contendo o número de vezes que a sequência “123” aparece na String. Por exemplo a string “[color=red]123[/color]459[color=red]123[/color]457[color=red]123[/color]6984[color=red]123[/color]”, deve retornar 4, pois “123” aparece quatro vezes! Tava vendo o método IndexOf, mas não to conseguindo implementar isso em um para faça, ou enquanto faça pois não to entendendo os seus parâmetros! e nem sei se ela percorre a string inteira ou só verifica a primeira ocorrência da sequência 123!
Se alguém puder da uma mão agradeço!!!
Ola amigo, tudo bem?
Acho que seria mais fácil utilizar a função charAt(int índex). A partir disso, você faria um loop percorrendo toda a strings e ir comparando o índex, index+1 e index+2, se forem iguais a 1, 2 e 3, respectivamente, você encontrou a sequencia desejada.
Segue código para ajudar.
public Integer contarsequencia(String str) {
Integer find = 0;
// Loop para verificar se a contem a sequencia 123.
// O loop vai ate str.length - 2 pois a sequencia contem 3 caracteres,
//sendo assim se chegou ao indexOf(str.length() - 1) a sequencia ja nao pode mais acontecer
for (int i = 0; i < (str.length() - 2); i++) {
// System.out.println(i);
if (str.charAt(i) == '1' && str.charAt(i+1) == '2' && str.charAt(i+2) == '3') {
find++; // Soma uma unidade a variável find
i+=2; // como você encontrou a sequencia desejada, você pode somar 2 ao índice do loop para diminuir o numero de repetições, se colocar +3, ele vai somar +1 ao final da execução, pulando uma letra da sequencia.
}
}
return find;
}
Espero que isso não seja um trabalho para sua faculdade ou colégio.
Além disso, seria de bom grado você postar o que ja tentou fazer e os erros que encontrou.
Espero ter ajudado.
Valeu
Fique tranquilo que não é pra trabalho nem nada, são exercícios que achei pela net mesmo! o problema tá na lógica mesmo, sei lá eu tento e tento e não sai nada. Tentei fazer ele usando charAt mas eu criei uma variável com o valor 123 kk acho q foi isso que não tava dando certo, também tentei o indexOf mas não tava acertando! então só saiu um monte de loucura kkk então nem postei aqui, pois tava nada a vê mesmo!!!
Bom acho que no inicio é assim mesmo até pegar o jeito neh?
Mas você é fera, tá me ajudando muito!!! alem do mais vendo seu raciocínio, acabo aprendendo neh!!!
Muito obrigado amigo!!!
Abraço
Oi,
o indexOf retorna o índice da ocorrência. No seu caso ele retornaria o índice 0, pois o texto 123 está em primeiro (posição 0) na sequencia de caracteres:
System.out.println("1234591234571236984123".indexOf("123")); // Retornará 0
Se você alterar o texto, por exemplo, para 1224591234571236984123 o indexOf retornará 6. Pois a sequencia 123 está agora na posição 6 do texto:
System.out.println("1224591234571236984123".indexOf("123")); // Retornará 6
Uma maneira simples de fazer o que você quer é utilizando o método split e mostrando como resultado o seu tamanho:
[code]String[] pedacos = “1234591234571236984123”.split(“123”);
System.out.println(pedacos.length);[/code]
Tchauzin!
Lina, sua solução funciona bem, mas existe um caso que ela não cobre, que seria se fosse tudo repetido seguidamente, por exemplo:System.out.println("123123123".split("123").length);
nesse caso específico o retorno é 0. Então acho que seria melhor uma solução usando expressões regulares, Como fiz no código abaixo:[code]public class Main {
public static void main(String[] args) {
String str = "1234591234571236984123";
System.out.println("Com split: " + comSplit(str, "123"));
System.out.println("Com regex: " + comRegex(str, "123"));
str = "123123123123";
System.out.println("Com split: " + comSplit(str, "123"));
System.out.println("Com regex: " + comRegex(str, "123"));
}
public static int comSplit(String str, String pattern){
return str.split(pattern).length;
}
public static int comRegex(String str, String patternString){
int matches = 0;
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(str);
while(matcher.find()){
matches ++;
}
return matches;
}
}[/code]Lembrando que esse código também tem um ponto fraco, se estiver procurando um “aa” na String “aaaa” ele vai encontrar 3 e não 2.
Obrigado a todos pela ajuda e por esclarecerem algumas dúvidas sobre esse método, me ajudaram muito mesmo!!!
Abraços a todos
Para resolver isso, o split tem um segundo parâmetro, pouco conhecido, chamado limit.
Quando limit é positivo, ele limita o tamanho máximo do array gerado.
Quando limit é zero, ele não limita o tamanho máximo E posições vazias são eliminadas do array de retorno.
Quando limit é negativo, ele não limita o tamanho máximo E posições vazias são mantidas.
Não sei quem achou que era uma boa idéia combinar comportamentos tão diferentes no mesmo parâmetro, mas você pode ter um exemplo da diferença aqui:
String value = "a123b123123c123123123";
System.out.println(value.split("123", 0).length); //4
System.out.println(value.split("123", -1).length); //7
System.out.println(value.split("123", 1).length); //1
De qualquer forma, como mostrado acima, você precisa subtrair 1 do resultado do length para dar certo.