@joaostm na minha opinião a sua solução foi a melhor possível pro problema que vc apresentou.
Pra melhorar vc teria que dar um passo além e começar a representar as entidades do seu programa como classes e começar a tirar proveito da biblioteca padrão do Java, usando ArrayList
, por exemplo, que é como um array no qual vc pode acrescentar itens indefinidamente.
O exemplo do @Rodrigo_Sasaki é excelente pra vc ver isso em prática, viu como ele criou uma classe só pra representar um produto?
Isso já seria o inicio da programação orientada a objetos.
Também fiz a minha versão pra mostrar uma abordagem diferente tirando proveito de recursos que foram adicionados a partir da versão 8 do Java, veja como ficou:
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.joining;
import static java.util.List.of;
class Produto {
String nome;
double compra;
double venda;
Produto(String nome, double compra, double venda) {
this.nome = nome;
this.compra = compra;
this.venda = venda;
}
double getLucro() {
return (venda * 100 / compra) - 100;
}
@Override
public String toString() {
return String.format("Nome: %s Compra: %.2f Venda: %.2f Lucro: %.2f", nome, compra, venda, getLucro());
}
}
public class Main {
public static void main(String[] args) {
var produtos = of(
new Produto("AAA", 100, 105),
new Produto("BBB", 100, 115),
new Produto("CCC", 100, 150),
new Produto("DDD", 100, 106),
new Produto("EEE", 100, 119),
new Produto("FFF", 100, 140)
);
var dados = produtos.stream().collect(groupingBy((produto) -> {
if (produto.getLucro() < 10) return "Menor que 10%";
else if (produto.getLucro() <= 20) return "De 10% à 20%";
else return "Maior que 20%";
}));
dados.forEach((lucro, prod) ->
System.out.printf("Lista de produtos com lucro %s:\n%s\n\n", lucro,
prod.stream().map(Produto::toString).collect(joining("\n"))));
}
}
Gostaria de deixar algumas observações:
#1 No Java, por convenção, ao declarar um array, os colchetes devem vir logo após o tipo e antes do nome.
int[] meuArray;
Da forma como vc fez não tá errado tecnicamente, mas na comunidade Java convencionou-se usar como mostrei.
Só pra não ficar só nas minhas palavras, eis o que diz um trecho do tutorial da Oracle (Tá no final da seção Declaring a Variable to Refer to an Array ^^):
You can also place the brackets after the array’s name:
// this form is discouraged
float anArrayOfFloats[];
However, convention discourages this form; the brackets identify the array type and should appear with the type designation.
#2 Evite declarar a variável de controle do for
fora do for
em que ela é usada, declare-a sempre no proprio for
mesmo que pareça desperdício e que pareça lógico que todos compartilhem a mesma variável.
Então, ao invés de fazer isso:
int i;
for(i = 0; i < 10; i++) { /* ... */ }
for(i = 0; i < 10; i++) { /* ... */ }
for(i = 0; i < 10; i++) { /* ... */ }
Faça isso:
for(int i = 0; i < 10; i++) { /* ... */ }
for(int i = 0; i < 10; i++) { /* ... */ }
for(int i = 0; i < 10; i++) { /* ... */ }
Quanto menor o escopo de uma variável, menos propenso a falhas seu programa será.
#3 Vc está usando o printf
que é bem legal, mas vc poderia tirar maior proveito dele.
Vc escreveu assim:
System.out.printf(pro[i] + ", %.2f%% de lucro.\n", tp);
Mas poderia ter feito assim:
System.out.printf("%s, %.2f%% de lucro.\n", pro[i], tp);
É só um detalhe, mas eu acho que faz diferença na legibilidade do código.