Vetor Altura

Tentei várias vezes criar um vetor para este exercicio:Receba um conjunto de dados contendo a altura e o sexo (masculino, feminino) de 10 pessoas. Fazer um algoritmo que calcule e escreva:
a. a maior e a menor altura do grupo;
b. média de altura dos homens;
c. o número de mulheres. Com for consegui, mas, com vetor sempre dá um ou mais erros.

package runnable;

import java.util.Arrays;
import java.util.DoubleSummaryStatistics;
import java.util.random.RandomGenerator;
import java.util.Scanner;
import java.util.Scanner;

public class altsexo_2 implements Runnable { 
  
  public static void main(String[] args) {
    private static final int QUANTIDADE = 10;
    
    public void run() {
      double[] alturas = new double[QUANTIDADE];
      int[] sexos = new int[QUANTIDADE];
      RandomGenerator generator = RandomGenerator.getDefault();
      
      for (int i = 0; i < QUANTIDADE; i++) {
        // Gera alturas entre 1.75 e 1.90
        alturas[i] = generator.nextDouble(1.75, 1.91);
        
        // Gera sexos entre 1 e 2
        sexos[i] = generator.nextInt(1, 3);
        
        // Obtém estatísticas automaticamente através de Stream
        DoubleSummaryStatistics estatisticas = Arrays.stream(alturas).summaryStatistics();
        
        // Exibe o relatório
        System.out.println("Alturas: " + Arrays.toString(alturas));
        System.out.println("  Sexos: " + Arrays.toString(sexos));
        
        System.out.println("Maior altura: " + estatisticas.getMax());
        System.out.println("Menor altura: " + estatisticas.getMin());
        System.out.println("Média altura: " + estatisticas.getAverage());
      }
    }
  }
}

Car… sua pergunta é a primeira que vou tentar responder aqui no fórum, mas vamos lá. Espero que eu consiga.

Pelo que entendi do enunciado, seria mais fácil se você criasse um vetor de objeto. Não sei se está familiarizada, mas seria basicamente um vetor em que cada posição houvesse um objeto. Poderia criar uma classe “Pessoa”, por exemplo que teria esses dois atributos: sexo e altura.

Creio que ficaria mais fácil de trabalhar com um vetor apenas, do que com 2 ao mesmo tempo. Como o vetor seria composto de objetos, você faria algo tipo: pessoa[0].getAltura, para poder fazer as comparações, saca?

De qualquer jeito acho que trabalharia assim se fosse cmg, até pq desconheço a biblioteca de Arrays e seus métodos.

Desculpa se me embaralhei, mas queria tentar minha primeira ajuda e vc foi a sortuda.

1 curtida

Quais erros?

Obrigada pelas dicas Abdouni28 ! :heart_eyes:

Olá Lucas :star_struck:
Os erros…quando finaliza o run, só aparece a maior altura e a média, não acusa a menor altura e nem o número de mulheres :neutral_face:

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);
    }
}