Calcular média com indexOf e substring, dúvida

Olá pessoal,

Estou tentando calcular a média dos números (separados por vírgulas) digitados pelo usuário em um programa java. Estou com dificuldades porque os dados que o usuário digita eu recupero numa string (regra da atividade). O erro no meu programa está exatamente na hora de converter a primeira posição do array em int. Vejam:

        String dados;
        int soma = 0;
        int contador = 0;
        Scanner pega = new Scanner(System.in);
        System.out.println("Informe uma sequência de números separados por vígulas: ");
        dados = pega.nextLine();
   
        for (int i = 0; i <= dados.length(); i++) {
   
            if (i == dados.indexOf(",")) {
               
                soma += Integer.parseInt(dados.substring(i, i - 1));
                System.out.println(soma);
                contador += 1;
                dados.substring(i, dados.length());
            } else {
                System.out.println("Falso");
            }
           
//            System.out.println(soma / contador);
           
        }

Eu estou errando na conversão do pedaço da string em int. Quando eu tiro a linha 12, tudo funciona, caso contrário não.
Alguma sujestão?

Grato

Imprima o que você está fazendo e veja o que está errado:

[code] String dados;
int soma = 0;
int contador = 0;
Scanner pega = new Scanner(System.in);
System.out.println("Informe uma sequência de números separados por vígulas: ");
dados = pega.nextLine();

    for (int i = 0; i &lt;= dados.length(); i++) {

        if (i == dados.indexOf(&quot;,&quot;)) {
           String texto = dados.substring(i, i - 1);
           System.out.println(texto); //Aqui tem que sair um número, sem a virgula
            soma += Integer.parseInt(texto);
            System.out.println(soma);
            contador += 1;
            dados.substring(i, dados.length());
        } else {
            System.out.println(&quot;Falso&quot;);
        }

// System.out.println(soma / contador);

    }

[/code]

teste assim:

[code]String dados;
int soma = 0;
int contador = 0;
Scanner pega = new Scanner(System.in);
System.out.println("Informe uma sequência de números separados por vígulas: ");
dados = pega.nextLine();

	String[] numeros = dados.split(",");
	
	
	for (int i = 0; i < numeros.length; i++) {  
	  
        soma += Integer.parseInt(numeros[i]);  
        System.out.println(soma);  
        contador += 1;  
        dados.substring(i, dados.length());  
	     
        System.out.println(soma / contador);  
	     
	}[/code]

Valeu! :slight_smile:

Acho que agora estou conseguindo.

Só que tem um problema, quando o usuário digitar 13, o parseInt() converte isso para 1 e 3 e não 13.
E mais outra coisa, tentei reinicializar a string inicial para contar a partir da vírgula encontrada + 1 ou i = dados.indexOf("," + 1) e não funfa.

Esqueci de acrescentar que só pode usar indexOf() e substring(). :slight_smile:

[quote=guj1]Valeu! :slight_smile:

Acho que agora estou conseguindo.

Só que tem um problema, quando o usuário digitar 13, o parseInt() converte isso para 1 e 3 e não 13.
E mais outra coisa, tentei reinicializar a string inicial para contar a partir da vírgula encontrada + 1 ou i = dados.indexOf("," + 1) e não funfa.

Esqueci de acrescentar que só pode usar indexOf() e substring(). :)[/quote]

Vc precisa entender que o numero está entre duas virgulas. O que vc está fazendo é assumir que o numero tem uma posição

String texto = dados.substring(i, i - 1);  // este -1 é assumir que tem 1 posição.

Vc não pode assumir isso.
Vc tem que encontrar a primeira viirgula, e depois a virgula a seguir a ela. O indexOf tem um metodo overload que faz isso.
Depois que vc tem as duas posições das virgulas, vc obtem o numero entre elas.
Tenha cuidado porque o primeiro e o ultimo numero não estão entre virgulas.

Bom eu fiz assim:

		double media = 0;
		int contador = 0;
		String dados;
		Scanner pega = new Scanner(System.in);
		System.out.println("Informe uma sequência de números separados por vígulas: ");
		dados = pega.nextLine();
		dados = dados + ",";
		System.out.println(dados);
		System.out.println("Tamanho inicial: " + dados.length());
		
		for (int i = 0; i <= dados.length(); i++) {
			if (i == dados.indexOf(",")) {
				String texto = dados.substring(i - 1, i);
				int num = Integer.parseInt(texto);
				contador += 1;
				System.out.println("Tamanho atual do contador dentro do if: " + contador); //Este não é impresso.
				media += num/contador;
			}
			contador += 10; //Aqui a atribuição funciona. Mas dentro do IF não funciona.
			dados = dados.substring(i + 1, dados.length());
			System.out.println("Tamanho atual: " + dados.length());
			System.out.println("Tamanho atual do contador fora do if: " + contador);
		}

		System.out.println("Média: " + media););
		}

		System.out.println("Média: " + media);

Olhem o resultado:

Informe uma sequência de números separados por vígulas:
7,6,5
7,6,5,
Tamanho inicial: 6
Tamanho atual: 5
Tamanho atual do contador fora do if: 10
Tamanho atual: 3
Tamanho atual do contador fora do if: 20
Tamanho atual: 0
Tamanho atual do contador fora do if: 30
Média: 0.0

E só tem um problema: as atribuições a média e contador não funcionam dentro do IF mesmo mesmo o laço entrando no IF. Não entendi o motivo.
Ao final a média sai zero e o contador também. E no debug não mostra nada, nenhuma variável nem o que elas estão recebendo, nada… (não sei se estou fazendo certo, mas tentei).

Leia o que o serrgiotaborda respondeu, o método substring pega uma string interna que vai de uma posição tal a outra, usando parâmetro seguintes vc tem os seguinte resultados:

(i, i - 1) Intervalo invalido pois vai de uma posição para antes dela.
(i - 1, i) Intervalo inválido para i menor ou igual a 0, para os intervalos válidos pega um único caractere (digito)

O que você precisa é de substrings
(0, posição da primeira virgula) primeiro número
(posição da ultima virgula + 1, até a próxima virgula ou fim da linha) demais números.

[quote=guj1]Bom eu fiz assim:
.[/quote]

Por tentativa e erro vc não chega lá. Tem que pensar no problema e entender.
O que vc quer ? - Separar uma string de números virgulas num conjunto de números
Depois que tem o conjunto, faça os cálculos.
Faça uma coisa de cada vez.

Depois que funcionar e vc entender porque funciona, ai vc pode tentar fazer tudo de uma vez só.

Primeira coisa, uma método que receba uma string , um separador, e retorna um array com os valores.
Como operar a string ? Com indexOf() e substring()
Que estrutura usar ? Repetição

Faça o algoritmo primeiro , depois implemente.

O algoritmo começa assim "Enquanto existirem separadores na string faça : "