Como tratar um CSV no java de forma que apresente os dois maiores produtos na saída?

Jovens , estou de volta precisando de uma outra ajuda…
não consigo fazer o algorítimo para ser apresentado os dois produtos mas caros com o valor do lado ,
na verdade eu tenho vários problemas os outros são para somar as quantidades dos produtos e o outro é pra dar a média de preços , essas 2 ai eu já tenho uma ideia como vou fazer , não sei se vai funcionar , mas já tenho uma ideia de como vai ser , mas essa primeira , ta complicado , não consigo achar uma solução…
vou fazer da mesma forma que eu fiz no outro tópico , mandar o algorítimo e a saída…

Algorítimo::::

package AlgoritimoQueVai;

import java.io.;
import java.util.
;

public class PagarAFaculdade {

public static void main(String[] args) {

	String arquivoCSV = ("D:\\estoque.csv");
	String linha ="";
	String separadorDeCampo = ";";
	BufferedReader conteudoCSV = null;
	int quantidade;
	double precoMedio;
	String preco = null;
	String nome;

	try {
		conteudoCSV = new BufferedReader (new FileReader(arquivoCSV));

		boolean primeiraLinha = true;

		while((linha = conteudoCSV.readLine()) != null) {
			
			if(primeiraLinha) {
				primeiraLinha = false;
			continue;
			}
			
			String [] campo = linha.split(separadorDeCampo);
			
			String formato = String.format("Produto: %-70s |Marca: %-20s |Preço: %-20s |Quantidade: %s", campo[0], campo[1], campo[2], campo[3]);

			
			
			System.out.println(formato);
		}
	}catch(FileNotFoundException e) {
		System.out.println("Arquivo não encontrado: " + e.getMessage());
	}catch(ArrayIndexOutOfBoundsException e) {
		System.out.println("Indice Errado!" + e.getMessage());
	}catch(IOException e) {
		System.out.println("IO erro: " + e.getMessage());
	}finally{
		if (arquivoCSV != null) {
			try {
				conteudoCSV.close();
			}catch(IOException e) {
				System.out.println("IO erro: " + e.getMessage());
			}}}}}

e a saída fica :::

Produto: Pen Drive Cruzer Blade USB 2.0 8GB SDCZ50-008G-B35 |Marca: SanDisk |Preço: 18.90 |Quantidade: 19
Produto: Chromecast 2 |Marca: Google |Preço: 269.00 |Quantidade: 12
Produto: Caixa de Som JBL Trip - Preta |Marca: JBL |Preço: 465.78 |Quantidade: 1
Produto: Memoria HyperX FURY 4GB 1866Mhz DDR3 CL10 Black Series - HX318C10FB/4 |Marca: Kingston |Preço: 119.90 |Quantidade: 6
Produto: Caixa de Som x100 - Azul e Laranja |Marca: Logitech |Preço: 99.99 |Quantidade: 6
Produto: Switch HDMI 1.3 9241 |Marca: Comtac |Preço: 159.89 |Quantidade: 8
Produto: HD Externo Portatil - 1.000GB (1TB) / USB 3.0 |Marca: Western Digital |Preço: 309.90 |Quantidade: 6
Produto: HD Externo 500GB - Canvio Basics - Preto |Marca: Toshiba |Preço: 254.91 |Quantidade: 5
Produto: Leitor de Codigo de Barras HS-950 (USB) |Marca: Comtac |Preço: 295.90 |Quantidade: 4
Produto: Pen Drive USB 2.0 8GB KC-U768G-4CR - Vermelho |Marca: Kingston |Preço: 14.90 |Quantidade: 9
Produto: Pen Drive DataTraveler USB 2.0 16GB DTGE9/16GB - Dourado |Marca: Kingston |Preço: 39.90 |Quantidade: 4
Produto: Pen Drive Ultra Fit 3.0 32GB SDCZ43-032G-G46 |Marca: SanDisk |Preço: 59.90 |Quantidade: 6
Produto: Pen Drive DataTraveler USB 3.0 32GB DTSE9G2/32GB |Marca: Kingston |Preço: 64.90 |Quantidade: 5
Produto: Webcam HD 720P C270 |Marca: Logitech |Preço: 93.50 |Quantidade: 11
Produto: Caixa de Som JBL GO 3W - Preta |Marca: JBL |Preço: 149.90 |Quantidade: 2
Produto: WebCam C920 Pro HD 15MP Full HD1080p |Marca: Logitech |Preço: 279.90 |Quantidade: 5
Produto: Leitor de Codigo de Barras SM-LCB02 (USB) |Marca: Sumay |Preço: 194.91 |Quantidade: 5
Produto: Mouse Sem Fio M170 Cinza - 910-004425 |Marca: Logitech |Preço: 41.90 |Quantidade: 22
Produto: Caixa de Som JBL GO 3W - Azul |Marca: JBL |Preço: 149.90 |Quantidade: 3
Produto: Mouse Optico USB M90 Preto |Marca: Logitech |Preço: 25.90 |Quantidade: 17
Produto: SSD 2.5 SUV400S37/120G |Marca: Kingston |Preço: 219.90 |Quantidade: 12
Produto: Teclado com Fio USB K120 Preto Resistente a Agua |Marca: Logitech |Preço: 46.90 |Quantidade: 23
Produto: Roteador Wireless AC 750Mbps Dual Band 3 ant. - DIR-809 |Marca: D-Link |Preço: 139.90 |Quantidade: 12
Produto: Roteador Wireless 150 Mbps - DIR-610 |Marca: D-Link |Preço: 59.90 |Quantidade: 17
Produto: Roteador 300 Mbps TL-WR840N |Marca: TP-Link |Preço: 77.90 |Quantidade: 32
Produto: Repetidor Expansor Wi-Fi Network 300Mbps TL-WA850RE |Marca: TP-Link |Preço: 110.90 |Quantidade: 8
Produto: Roteador Wireless 300Mbps 2.4GHz 4P - F9K1002 N300 |Marca: Belkin |Preço: 51.90 |Quantidade: 16
Produto: Pen Drive DataTraveler USB 2.0 32GB DTSE9H/32GB |Marca: Kingston |Preço: 39.90 |Quantidade: 26
Produto: Pen Drive Ultra Dual Drive SanDisk 3.0 32GB SDDD2-032G-G46 |Marca: SanDisk |Preço: 56.90 |Quantidade: 4
Produto: Memoria HyperX FURY 8GB 1866Mhz DDR3 CL10 Black Series - HX318C10FB/8 |Marca: Kingston |Preço: 215.90 |Quantidade: 2

nesse caso a saída tem que ter também os dois mais caros produtos com o nome e valores , e ai que eu me quebro …

Primeira coisa que eu faria é criar uma classe que representa um Produto:

class Produto {

    final String nome;
    final String marca;
    final double preco;
    final int quantidade;

    Produto(String nome, String marca, double preco, int quantidade) {
        this.nome = nome;
        this.marca = marca;
        this.preco = preco;
        this.quantidade = quantidade;
    }
}

Depois tudo ficaria mais simples de entender:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class PagarAFaculdade {

    public static void main(String[] args) {
        try {
            PagarAFaculdade programa = new PagarAFaculdade();
            programa.executar();
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    public void executar() {
        try {
            String arquivoCSV = "D:\\estoque.csv";
            String separadorDeCampo = ";";
            List<Produto> produtos = lerProdutos(arquivoCSV, separadorDeCampo);

            String formato = "Produto: %s | Marca: %s | Preço: %.2f | Quantidade: %d%n";
            for (Produto produto : produtos) {
                System.out.printf(formato, produto.nome, produto.marca, produto.preco, produto.quantidade);
            }

            System.out.println("Os 2 produtos mais caros:");

            Comparator<Produto> ordenacaoDescendentePeloPreco = (p1, p2) -> (int) (p2.preco - p1.preco);
            produtos.sort(ordenacaoDescendentePeloPreco);
            
            Produto primeiro = produtos.get(0);
            System.out.printf(formato, primeiro.nome, primeiro.marca, primeiro.preco, primeiro.quantidade);

            Produto segundo = produtos.get(1);
            System.out.printf(formato, segundo.nome, segundo.marca, segundo.preco, segundo.quantidade);

        } catch (FileNotFoundException e) {
            System.out.println("Arquivo não encontrado: " + e.getMessage());
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Indice errado: " + e.getMessage());
        } catch (IOException e) {
            System.out.println("IO erro: " + e.getMessage());
        }
    }

    private List<Produto> lerProdutos(String caminho, String separador) throws IOException {
        List<Produto> produtos = new ArrayList<>();
        BufferedReader arquivo = new BufferedReader(new FileReader(caminho));
        arquivo.readLine(); // ignorar conteudo da primeira linha
        String linha = null;
        while ((linha = arquivo.readLine()) != null) { // ler as linhas seguintes
            String[] campos = linha.split(separador);
            String nome = campos[0];
            String marca = campos[1];
            double preco = Double.parseDouble(campos[2]);
            int quantidade = Integer.parseInt(campos[3]);
            Produto produto = new Produto(nome, marca, preco, quantidade); // pra cada linha criar um objeto produto
            produtos.add(produto);
        }
        arquivo.close();
        return produtos;
    }
}

Rapaz , Muito Obrigado , Mas Muito Obrigado Mesmo…
Confesso que demorei pra entender o que tava acontecendo ai … fiquei uma ou duas horas lendo e relendo e tentando entender , e jogando no meu algorítimo e adaptando pra ficar a melhor forma possível , foi bem louco…
o algorítimo final ficou assim::::

package AlgorítimoQueVai;

import java.io.;
import java.util.
;
public class PagarAFaculdade {
int i =0;
int total=-2;
String arquivoCSV = (“D:\estoque.csv”);
String linha ="";
String separadorDeCampo = “;”;
double media =0;
double soma = 0;
double preco = 0;
double numero = 0;
BufferedReader conteudoCSV = null;
class Produto {

	final String nome;
	final String marca;
	final double preco;
	final int estoque;

	Produto(String nome, String marca, double preco, int estoque) {
		this.nome = nome;
		this.marca = marca;
		this.preco = preco;
		this.estoque = estoque;
	}
}
public static void main(String[] args) {
	try {
		PagarAFaculdade programa = new PagarAFaculdade();
		programa.executar();
	} catch (Throwable e) {
		e.printStackTrace();
	}
}
private void executar() {

try {
List produtos = lerProdutos(arquivoCSV, separadorDeCampo);
conteudoCSV = new BufferedReader (new FileReader(arquivoCSV));

		String formato = "Produto: %s | Marca: %s | Preço: %.2f | Quantidade: %d%n";

		System.out.println("Os 2 Produtos Mais Caros São: ");
		Comparator<Produto> ordenacaoDescendentePeloPreco = (p1, p2) -> (int) (p2.preco - p1.preco);
		produtos.sort(ordenacaoDescendentePeloPreco);

		Produto primeiro = produtos.get(0);
		System.out.printf(formato, primeiro.nome, primeiro.marca, primeiro.preco, primeiro.estoque);

		Produto segundo = produtos.get(1);
		System.out.printf(formato, segundo.nome, segundo.marca, segundo.preco, segundo.estoque);
		
		System.out.println("\n");

		boolean primeiraLinha = true;

		while((linha = conteudoCSV.readLine()) != null) {
			total++;

			if(primeiraLinha) {
				primeiraLinha = false;
				continue;
			}
			String [] campo = linha.split(separadorDeCampo);

			String organizado = String.format("Produto: %-70s |Marca: %-20s |Preço: %-20s |Quantidade: %s", campo[0], campo[1], campo[2], campo[3]);

			java.text.NumberFormat valor = java.text.NumberFormat.getNumberInstance();  
			valor.setMinimumFractionDigits(2);
			valor.setMaximumFractionDigits(2);  
			String real = valor.format(preco);
			real= campo[2];
			real = real.replaceAll(",", ".");
			preco = Double.parseDouble(real);

			java.text.NumberFormat quantidade = java.text.NumberFormat.getNumberInstance();
			String estoque = quantidade.format(numero);
			estoque = campo[3];
			numero = Double.parseDouble(estoque);

			while( i<=total) {
				i++;
				media = media+preco;
				soma = soma+numero;

			}
			System.out.println(organizado);
		}
	} catch (FileNotFoundException e) {
		System.out.println("Arquivo não encontrado: " + e.getMessage());
	} catch (ArrayIndexOutOfBoundsException e) {
		System.out.println("Indice errado: " + e.getMessage());
	} catch (IOException e) {
		System.out.println("IO erro: " + e.getMessage());
	}

	System.out.printf("%nA Média Dos Preços De Todos Os Produtos Até O Momento É De: R$ %.2f %n" ,(media/i));
	System.out.printf("A Quantidade De Itens No Estoque No Momento É De: %.0f %n",soma);}
private List<Produto> lerProdutos(String caminho, String separador) throws IOException {
	List<Produto> produtos = new ArrayList<>();
	BufferedReader arquivo = new BufferedReader(new FileReader(caminho));
	arquivo.readLine(); // ignorar conteudo da primeira linha
	String linha = null;
	while ((linha = arquivo.readLine()) != null) { // ler as linhas seguintes
		String[] campos = linha.split(separador);
		String nome = campos[0];
		String marca = campos[1];
		double preco = Double.parseDouble(campos[2]);
		int quantidade = Integer.parseInt(campos[3]);
		Produto produto = new Produto(nome, marca, preco, quantidade); // pra cada linha criar um objeto produto
		produtos.add(produto);
	}
	arquivo.close();
	return produtos;

}}
A Finalidade dele era fazer o JAVA ler o CSV , imprimir na tela a tabela do CSV sem a primeira linha , pq a primeira linha era só besteira, era pegar os 2 valores mas altos dessa tabela e imprimir juntamente com o nome , imprimir quantos itens havia no estoque e qual a média de todos os produtos…

Aparentemente , saiu tudo ótimo…

E uma curiosidade: esse algorítimo é o meu teste de estágio pra programador , que por sinal estou precisando tanto pra me manter quanto pra pagar a própria faculdade ( dinheiro do seguro acabando e eu tô correndo muito pra não trancar a faculdade e nem desistir e nem passar necessidade né ) , então mano , muito obrigado mesmo …

Quando postar código no fórum, seleciona o código postado e clica no botão </>, senão fica muito ruim pra ler.

Receio que você não adaptou bem seu algoritmo, pois você não reutilizou a lista de produtos criada, ao invés disso você implementou outro laço para ler o CSV que já havia sido lido.

Eu dei uma readaptada no teu código e pus alguns comentários, veja se te ajuda:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class PagarAFaculdade {

    class Produto {

        final String nome;
        final String marca;
        final double preco;
        final int estoque;

        Produto(String nome, String marca, double preco, int estoque) {
            this.nome = nome;
            this.marca = marca;
            this.preco = preco;
            this.estoque = estoque;
        }
    }

    public static void main(String[] args) {
        try {
            PagarAFaculdade programa = new PagarAFaculdade();
            programa.executar();
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    private String arquivoCSV = "D:\\estoque.csv";
    private String separadorDeCampo = ";";
    private String organizado = "Produto: %s | Marca: %s | Preço: %.2f | Quantidade: %d%n";
    private double precoMedio;
    private int totalEstoque;

    public void executar() {
        try {
            // ler o arquivo CSV e obter a lista de produtos
            List<Produto> produtos = lerProdutos(arquivoCSV, separadorDeCampo);

            // obter os produtos mais caros e apresentar
            System.out.println("Os Produtos Mais Caros São: ");
            Produto[] maisCaros = obterProdutosMaisCaros(produtos);
            for (Produto produto : maisCaros) {
                System.out.printf(organizado, produto.nome, produto.marca, produto.preco, produto.estoque);
            }

            calcularPrecoMedio_e_TotalEstoque(produtos);
            System.out.printf("%nA Média Dos Preços De Todos Os Produtos Até O Momento É De: R$ %.2f %n", precoMedio);

            System.out.printf("A Quantidade De Itens No Estoque No Momento É De: %.0f %n", totalEstoque);

        } catch (FileNotFoundException e) {
            System.out.println("Arquivo não encontrado: " + e.getMessage());
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Indice errado: " + e.getMessage());
        } catch (IOException e) {
            System.out.println("IO erro: " + e.getMessage());
        }
    }

    // calcula o preço médio e o total do estoque dos produtos
    private void calcularPrecoMedio_e_TotalEstoque(List<Produto> produtos) {
        totalEstoque = 0;
        double soma = 0;
        for (Produto produto : produtos) {
            totalEstoque += produto.estoque;
            soma += produto.preco;
        }
        double quantidade = produtos.size();
        precoMedio = soma / quantidade;
        return;
    }

    // lê o arquivo CSV e obtém uma lista de produtos
    private List<Produto> lerProdutos(String caminho, String separador) throws IOException {
        List<Produto> produtos = new ArrayList<>();
        BufferedReader arquivo = new BufferedReader(new FileReader(caminho));
        arquivo.readLine(); // ignorar conteudo da primeira linha
        String linha = null;
        while ((linha = arquivo.readLine()) != null) { // ler as linhas seguintes
            String[] campos = linha.split(separador);
            String nome = campos[0];
            String marca = campos[1];
            double preco = Double.parseDouble(campos[2]);
            int quantidade = Integer.parseInt(campos[3]);
            Produto produto = new Produto(nome, marca, preco, quantidade); // pra cada linha criar um objeto produto
            produtos.add(produto);
        }
        arquivo.close();
        return produtos;
    }

    // obtém os 2 produtos mais caros
    private Produto[] obterProdutosMaisCaros(List<Produto> produtos) {
        Comparator<Produto> ordenacaoDescendentePeloPreco = (p1, p2) -> (int) (p2.preco - p1.preco);
        produtos.sort(ordenacaoDescendentePeloPreco);
        return new Produto[] { produtos.get(0), produtos.get(1) };
    }
}