packagerunnable;importjava.util.Arrays;importjava.util.DoubleSummaryStatistics;importjava.util.random.RandomGenerator;importjava.util.Scanner;importjava.util.Scanner;publicclassaltsexo_2implementsRunnable{publicstaticvoidmain(String[]args){privatestaticfinalintQUANTIDADE=10;publicvoidrun(){double[]alturas=newdouble[QUANTIDADE];int[]sexos=newint[QUANTIDADE];RandomGeneratorgenerator=RandomGenerator.getDefault();for(inti=0;i<QUANTIDADE;i++){// Gera alturas entre 1.75 e 1.90alturas[i]=generator.nextDouble(1.75,1.91);// Gera sexos entre 1 e 2sexos[i]=generator.nextInt(1,3);// Obtém estatísticas automaticamente através de StreamDoubleSummaryStatisticsestatisticas=Arrays.stream(alturas).summaryStatistics();// Exibe o relatórioSystem.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.
L
Lucas_Camara
Quais erros?
A
Amanda2022
Obrigada pelas dicas Abdouni28 !
A
Amanda2022
Olá Lucas
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
H
hugokotsubo
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):
importjava.util.Arrays;importjava.util.DoubleSummaryStatistics;importjava.util.random.RandomGenerator;importjava.util.stream.DoubleStream;publicclassTestAltura{privatestaticfinalintQUANTIDADE=10;publicstaticvoidmain(String[]args){double[]alturasHomens=newdouble[QUANTIDADE];double[]alturasMulheres=newdouble[QUANTIDADE];intqtdHomens=0,qtdMulheres=0;RandomGeneratorgenerator=RandomGenerator.getDefault();for(inti=0;i<QUANTIDADE;i++){// Gera alturas entre 1.75 e 1.90doublealtura=generator.nextDouble(1.75,1.91);// Gera sexos entre 1 e 2intsexo=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 ifalturasMulheres[qtdMulheres++]=altura;}}// diminui os arrays para terem apenas a quantidade de cada sexoalturasHomens=Arrays.copyOf(alturasHomens,qtdHomens);alturasMulheres=Arrays.copyOf(alturasMulheres,qtdMulheres);// Exibe o relatórioSystem.out.println("Alturas Homens: "+Arrays.toString(alturasHomens));System.out.println("Alturas Mulheres: "+Arrays.toString(alturasMulheres));// estatísticas de todosDoubleSummaryStatisticsstatsAll=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 homensDoubleSummaryStatisticsstats=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:
importjava.util.List;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.DoubleSummaryStatistics;importjava.util.random.RandomGenerator;importjava.util.stream.*;publicclassTestAltura{privatestaticfinalintQUANTIDADE=10;publicstaticvoidmain(String[]args){List<Double>alturasHomens=newArrayList<>();List<Double>alturasMulheres=newArrayList<>();RandomGeneratorgenerator=RandomGenerator.getDefault();for(inti=0;i<QUANTIDADE;i++){// Gera alturas entre 1.75 e 1.90doublealtura=generator.nextDouble(1.75,1.91);// Gera sexos entre 1 e 2intsexo=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 ifalturasMulheres.add(altura);}}// Exibe o relatórioSystem.out.println("Alturas Homens: "+alturasHomens);System.out.println("Alturas Mulheres: "+alturasMulheres);// estatísticas de todosDoubleSummaryStatisticsstatsAll=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 homensDoubleSummaryStatisticsstats=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:
importjava.util.random.RandomGenerator;publicclassTestAltura{privatestaticfinalintQUANTIDADE=10;publicstaticvoidmain(String[]args){doublemaior=Double.MIN_VALUE,menor=Double.MAX_VALUE,mediaHomens=0;intqtdHomens=0,qtdMulheres=0;RandomGeneratorgenerator=RandomGenerator.getDefault();for(inti=0;i<QUANTIDADE;i++){// Gera alturas entre 1.75 e 1.90doublealtura=generator.nextDouble(1.75,1.91);if(altura>maior){maior=altura;}if(altura<menor){menor=altura;}// Gera sexos entre 1 e 2intsexo=generator.nextInt(1,3);if(sexo==1){// homemqtdHomens++;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 ifqtdMulheres++;}}mediaHomens/=qtdHomens;System.out.println("Maior altura: "+maior);System.out.println("Menor altura: "+menor);// média apenas dos homensSystem.out.println("Média altura homens: "+mediaHomens);System.out.println("Quantidade de mulheres: "+qtdMulheres);}}