Tem certeza que isso aqui funciona? Um campo private static
não pode estar dentro de um método, então ele deveria estar fora do main
. O método run
dentro do main
também está bem esquisito (nem compila, na verdade).
Aliás, existe algum motivo para usar um Runnable
? A menos que queira criar threads, não vejo razão para usá-lo. Teste primeiro com todo o código no main
, e depois tente mudar para thread (se realmente for uma necessidade).
De qualquer forma, você mostra as estatísticas dentro do for
, o que para mim não faz sentido (só deveria mostrar no final, depois de gerar todos os dados).
Mas ainda sim está errado, porque o exercício pede a média de altura dos homens, mas nos arrays você coloca as alturas de homens e mulheres misturados.
Se a ideia é ter estatísticas separadas, então crie arrays separados (e só junte nos casos em que faz sentido, como parece ser o caso da maior e menor altura):
import java.util.Arrays;
import java.util.DoubleSummaryStatistics;
import java.util.random.RandomGenerator;
import java.util.stream.DoubleStream;
public class TestAltura {
private static final int QUANTIDADE = 10;
public static void main(String[] args) {
double[] alturasHomens = new double[QUANTIDADE];
double[] alturasMulheres = new double[QUANTIDADE];
int qtdHomens = 0, qtdMulheres = 0;
RandomGenerator generator = RandomGenerator.getDefault();
for (int i = 0; i < QUANTIDADE; i++) {
// Gera alturas entre 1.75 e 1.90
double altura = generator.nextDouble(1.75, 1.91);
// Gera sexos entre 1 e 2
int sexo = generator.nextInt(1, 3);
if (sexo == 1) {
alturasHomens[qtdHomens++] = altura;
} else {
// no generator eu gerei 1 ou 2, então se não é 1 eu já sei que é 2, por isso não precisa de outro if
alturasMulheres[qtdMulheres++] = altura;
}
}
// diminui os arrays para terem apenas a quantidade de cada sexo
alturasHomens = Arrays.copyOf(alturasHomens, qtdHomens);
alturasMulheres = Arrays.copyOf(alturasMulheres, qtdMulheres);
// Exibe o relatório
System.out.println("Alturas Homens: " + Arrays.toString(alturasHomens));
System.out.println("Alturas Mulheres: " + Arrays.toString(alturasMulheres));
// estatísticas de todos
DoubleSummaryStatistics statsAll = DoubleStream.concat(Arrays.stream(alturasHomens), Arrays.stream(alturasMulheres)).summaryStatistics();
System.out.println("Maior altura: " + statsAll.getMax());
System.out.println("Menor altura: " + statsAll.getMin());
// média apenas dos homens
DoubleSummaryStatistics stats = Arrays.stream(alturasHomens).summaryStatistics();
System.out.println("Média altura homens: " + statsAll.getAverage());
System.out.println("Quantidade de mulheres: " + qtdMulheres);
}
}
Listas em vez de arrays
Mas como os tamanhos são variáveis (ou seja, você não sabe quantos homens e mulheres terá, já que depende dos números aleatórios), acho melhor usar listas em vez de arrays:
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.DoubleSummaryStatistics;
import java.util.random.RandomGenerator;
import java.util.stream.*;
public class TestAltura {
private static final int QUANTIDADE = 10;
public static void main(String[] args) {
List<Double> alturasHomens = new ArrayList<>();
List<Double> alturasMulheres = new ArrayList<>();
RandomGenerator generator = RandomGenerator.getDefault();
for (int i = 0; i < QUANTIDADE; i++) {
// Gera alturas entre 1.75 e 1.90
double altura = generator.nextDouble(1.75, 1.91);
// Gera sexos entre 1 e 2
int sexo = generator.nextInt(1, 3);
if (sexo == 1) {
alturasHomens.add(altura);
} else {
// no generator eu gerei 1 ou 2, então se não é 1 eu já sei que é 2, por isso não precisa de outro if
alturasMulheres.add(altura);
}
}
// Exibe o relatório
System.out.println("Alturas Homens: " + alturasHomens);
System.out.println("Alturas Mulheres: " + alturasMulheres);
// estatísticas de todos
DoubleSummaryStatistics statsAll = Stream.concat(alturasHomens.stream(), alturasMulheres.stream()).collect(Collectors.summarizingDouble(Double::doubleValue));
System.out.println("Maior altura: " + statsAll.getMax());
System.out.println("Menor altura: " + statsAll.getMin());
// média apenas dos homens
DoubleSummaryStatistics stats = alturasHomens.stream().collect(Collectors.summarizingDouble(Double::doubleValue));
System.out.println("Média altura homens: " + statsAll.getAverage());
System.out.println("Quantidade de mulheres: " + alturasMulheres.size());
}
}
Mas precisa de listas/arrays?
Você precisa guardar todos os dados lidos, ou só precisa das estatísticas no final?
Se só precisa das estatísticas, e não necessariamente de todos os valores, aí não precisa das listas e nem dos arrays, pode calcular tudo durante o loop:
import java.util.random.RandomGenerator;
public class TestAltura {
private static final int QUANTIDADE = 10;
public static void main(String[] args) {
double maior = Double.MIN_VALUE, menor = Double.MAX_VALUE, mediaHomens = 0;
int qtdHomens = 0, qtdMulheres = 0;
RandomGenerator generator = RandomGenerator.getDefault();
for (int i = 0; i < QUANTIDADE; i++) {
// Gera alturas entre 1.75 e 1.90
double altura = generator.nextDouble(1.75, 1.91);
if (altura > maior) {
maior = altura;
}
if (altura < menor) {
menor = altura;
}
// Gera sexos entre 1 e 2
int sexo = generator.nextInt(1, 3);
if (sexo == 1) { // homem
qtdHomens++;
mediaHomens += altura;
} else { /// mulher
// no generator eu gerei 1 ou 2, então se não é 1 eu já sei que é 2, por isso não precisa de outro if
qtdMulheres++;
}
}
mediaHomens /= qtdHomens;
System.out.println("Maior altura: " + maior);
System.out.println("Menor altura: " + menor);
// média apenas dos homens
System.out.println("Média altura homens: " + mediaHomens);
System.out.println("Quantidade de mulheres: " + qtdMulheres);
}
}