Split Java

Pessoal, preciso imprimir todos os Subgrupos (são esse “aaaaa”, “bbbbb”, etc) em ordem alfabetica e sumarizada.

Mas a slip ta dando erro no momento de separar a string.

List produtos = new ArrayList();

	produtos.add(new Produto(8923, "aaaaa", 12/4/2020, 30/11/2020, 3));
	produtos.add(new Produto(8923,"aaaaa" ,11/4/2020,30/11/2020,1));
	produtos.add(new Produto(9547,"ccccc",13/1/2020,30/11/2020,9));
	produtos.add(new Produto(9547,"ccccc",21/1/2020,30/11/2020,2));
	produtos.add(new Produto(8923,"aaaaa",10/4/2020,30/11/2020,1));
	produtos.add(new Produto(8923,"bbbbb",10/4/2020,30/11/2020,1));
	produtos.add(new Produto(1234,"ddddd",29/11/2020,30/11/2020,2));
	produtos.add(new Produto(1234,"ddddd",17/3/2020,30/11/2020,5));
	produtos.add(new Produto(9547,"ddddd",1/1/2020,30/11/2020,9));
	produtos.add(new Produto(8923,"bbbbb",9/4/2020,30/11/2020,3));
	produtos.add(new Produto(99987,"bbbbb",7/5/2020,30/11/2020,11));
	produtos.add(new Produto(8923,"aaaaa",9/4/2020,30/11/2020,3));
	produtos.add(new Produto(99987,"aaaaa",7/5/2020,30/11/2020,12));
	produtos.add(new Produto(1234,"aaaaa",7/5/2020,30/11/2020,3));
	produtos.add(new Produto(8923,"ccccc",20/2/2020,30/11/2020,1));
	produtos.add(new Produto(8923,"ccccc",10/4/2020,30/11/2020,1));
	produtos.add(new Produto(8923,"ccccc",9/4/2020,30/11/2020,3));
	produtos.add(new Produto(1234,"aaaaa",8/5/2020,30/11/2020,2));
	produtos.add(new Produto(1234,"aaaaa",9/5/2020,30/11/2020,1));
	produtos.add(new Produto(9547,"aaaaa",1/1/2020,30/11/2020,3));
	produtos.add(new Produto(8923,"bbbbb",12/4/2020,30/11/2020,3));
	produtos.add(new Produto(8923,"bbbbb",20/2/2020,30/11/2020,1));
	produtos.add(new Produto(1234,"bbbbb",18/9/2020,30/11/2020,3));
	produtos.add(new Produto(1234,"bbbbb",21/6/2020,30/11/2020,2));
	produtos.add(new Produto(1234,"bbbbb",17/3/2020,30/11/2020,5));
	produtos.add(new Produto(9547,"bbbbb",21/1/2020,30/11/2020,2));
	produtos.add(new Produto(8923,"ccccc",12/7/2020,30/11/2020,3));
	produtos.add(new Produto(99987,"ccccc",7/5/2020,30/11/2020,10));
	produtos.add(new Produto(1234,"ccccc",18/9/2020,30/11/2020,3));
	produtos.add(new Produto(1234,"ccccc",21/6/2020,30/11/2020,2));
	produtos.add(new Produto(9547,"bbbbb",1/1/2020,30/11/2020,9));
	produtos.add(new Produto(9547,"bbbbb",11/1/2020,30/11/2020,9));
	produtos.add(new Produto(9547,"bbbbb",13/1/2020,30/11/2020,9));
	produtos.add(new Produto(1234,"ccccc",17/3/2020,30/11/2020,5));
	produtos.add(new Produto(8923,"ddddd",9/4/2020,30/11/2020,3));
	produtos.add(new Produto(99987,"ddddd",7/5/2020,30/11/2020,100));
	produtos.add(new Produto(9547,"ccccc",1/1/2020,30/11/2020,9));
	produtos.add(new Produto(9547,"ccccc",11/1/2020,30/11/2020,9));
	produtos.add(new Produto(8923,"ccccc",12/7/2020,30/11/2020,3));
	produtos.add(new Produto(8923,"ccccc",20/2/2020,30/11/2020,1));
	produtos.add(new Produto(8923,"ddddd",10/4/2020,30/11/2020,1));
	produtos.add(new Produto(1234,"ddddd",18/9/2020,30/11/2020,3));
	produtos.add(new Produto(9547,"ddddd",11/1/2020,30/11/2020,9));
	produtos.add(new Produto(9547,"ccccc",13/1/2020,30/11/2020,9));
	produtos.add(new Produto(9547,"ccccc",21/1/2020,30/11/2020,2));
	produtos.add(new Produto(8923,"ddddd",10/3/2020,30/11/2020,10));
	
	
	Collections.sort(produtos);

	
    System.out.println("Subgrupos: ");
	
	for (Produto produto : produtos) { // Imprimir todos os Subgrupos do arquivo dados_mercado.txt​
		String [] arrAux = produto.split(";");	
		System.out.println(arrAux [1]);		
		
	}

Não entendi.

  • Cadê o código da classe Produto?
  • Pq não está usando uma lista de produtos ao invés de uma lista de Object?
  • Vc estabeleceu uma relação de ordem total na sua classe Produto, ou seja, implementou a interface Comparable da forma correta?
  • Esse método “split” da classe produto, o que vc faz nele? Vc cria uma String que representa o produto e faz um split nela? Pq já não retorna exatamente o que quer?
  • Qual seria o resultado esperado para sua entrada?
  • Qual o objetivo de seu array “arrAux”?

Organizei e remontei o meu código de ontem pra hoje

public static void main(String[] args) {
	
	
	List<Produto> produtos = new ArrayList<Produto>();
	
	produtos.add(new Produto(8923, "aaaaa", 12/4/2020, 30/11/2020, 3));
	produtos.add(new Produto(8923,"aaaaa" ,11/4/2020,30/11/2020,1));
	produtos.add(new Produto(9547,"ccccc",13/1/2020,30/11/2020,9));
	produtos.add(new Produto(9547,"ccccc",21/1/2020,30/11/2020,2));
	produtos.add(new Produto(8923,"aaaaa",10/4/2020,30/11/2020,1));
	produtos.add(new Produto(8923,"bbbbb",10/4/2020,30/11/2020,1));
	produtos.add(new Produto(1234,"ddddd",29/11/2020,30/11/2020,2));
	produtos.add(new Produto(1234,"ddddd",17/3/2020,30/11/2020,5));
	produtos.add(new Produto(9547,"ddddd",1/1/2020,30/11/2020,9));
	produtos.add(new Produto(8923,"bbbbb",9/4/2020,30/11/2020,3));
	produtos.add(new Produto(99987,"bbbbb",7/5/2020,30/11/2020,11));
	produtos.add(new Produto(8923,"aaaaa",9/4/2020,30/11/2020,3));
	produtos.add(new Produto(99987,"aaaaa",7/5/2020,30/11/2020,12));
	produtos.add(new Produto(1234,"aaaaa",7/5/2020,30/11/2020,3));
	produtos.add(new Produto(8923,"ccccc",20/2/2020,30/11/2020,1));
	produtos.add(new Produto(8923,"ccccc",10/4/2020,30/11/2020,1));
	produtos.add(new Produto(8923,"ccccc",9/4/2020,30/11/2020,3));
	produtos.add(new Produto(1234,"aaaaa",8/5/2020,30/11/2020,2));
	produtos.add(new Produto(1234,"aaaaa",9/5/2020,30/11/2020,1));
	produtos.add(new Produto(9547,"aaaaa",1/1/2020,30/11/2020,3));
	produtos.add(new Produto(8923,"bbbbb",12/4/2020,30/11/2020,3));
	produtos.add(new Produto(8923,"bbbbb",20/2/2020,30/11/2020,1));
	produtos.add(new Produto(1234,"bbbbb",18/9/2020,30/11/2020,3));
	produtos.add(new Produto(1234,"bbbbb",21/6/2020,30/11/2020,2));
	produtos.add(new Produto(1234,"bbbbb",17/3/2020,30/11/2020,5));
	produtos.add(new Produto(9547,"bbbbb",21/1/2020,30/11/2020,2));
	produtos.add(new Produto(8923,"ccccc",12/7/2020,30/11/2020,3));
	produtos.add(new Produto(99987,"ccccc",7/5/2020,30/11/2020,10));
	produtos.add(new Produto(1234,"ccccc",18/9/2020,30/11/2020,3));
	produtos.add(new Produto(1234,"ccccc",21/6/2020,30/11/2020,2));
	produtos.add(new Produto(9547,"bbbbb",1/1/2020,30/11/2020,9));
	produtos.add(new Produto(9547,"bbbbb",11/1/2020,30/11/2020,9));
	produtos.add(new Produto(9547,"bbbbb",13/1/2020,30/11/2020,9));
	produtos.add(new Produto(1234,"ccccc",17/3/2020,30/11/2020,5));
	produtos.add(new Produto(8923,"ddddd",9/4/2020,30/11/2020,3));
	produtos.add(new Produto(99987,"ddddd",7/5/2020,30/11/2020,100));
	produtos.add(new Produto(9547,"ccccc",1/1/2020,30/11/2020,9));
	produtos.add(new Produto(9547,"ccccc",11/1/2020,30/11/2020,9));
	produtos.add(new Produto(8923,"ccccc",12/7/2020,30/11/2020,3));
	produtos.add(new Produto(8923,"ccccc",20/2/2020,30/11/2020,1));
	produtos.add(new Produto(8923,"ddddd",10/4/2020,30/11/2020,1));
	produtos.add(new Produto(1234,"ddddd",18/9/2020,30/11/2020,3));
	produtos.add(new Produto(9547,"ddddd",11/1/2020,30/11/2020,9));
	produtos.add(new Produto(9547,"ccccc",13/1/2020,30/11/2020,9));
	produtos.add(new Produto(9547,"ccccc",21/1/2020,30/11/2020,2));
	produtos.add(new Produto(8923,"ddddd",10/3/2020,30/11/2020,10));

	
	Collections.sort(produtos);

	System.out.println("Subgrupos"); // Imprimir todos os Subgrupos do arquivo dados_mercado.txt

	for (int i = 0; i < produtos.size(); i++) {
		System.out.println(produtos.get(i).getSub_grupo());
	}

	System.out.println("====================");
	produtos.sort(new Comparator <Produto>(){

		@Override
		public int compare(Produto prod1, Produto prod2) {
			Integer quantidadeProd1 = prod1.getQuantidade();
			Integer quantidadeProd2 = prod2.getQuantidade();

			return quantidadeProd2.compareTo(quantidadeProd1);
		}
	});
	for (Produto produto : produtos) {
		System.out.println(produto);
	}
}

}

Mas, eu preciso retornar apenas a linha do produto que possui o maior valor de venda (que no caso é o primeiro já que eu ordenei do maior para o menor)

Se for permitido, você pode usar streams.

Produto produtoMaisCaro = produtos.stream()
                .max(Comparator.comparing(Produto::getValue))
                .orElseGet(Produto::new);

O código está assim mesmo ou você esqueceu das aspas? Porque 9/4/2020, sem aspas, na verdade é uma conta: 9 dividido por 4 dividido por 2020.

Se a ideia era ter uma data, então deveria ser uma String, com aspas: "9/4/2020" (ou então um dos tipos disponíveis para data, como por exemplo java.time.LocalDate para Java >= 8, ou java.util.Date).

eu já tinha tentado usar o stream, mas ele me apresenta erros relacionado ao produto

Produto quantMaior = produtos.stream()
            .max(Comparator.comparing(Produto::getQuantidade))
            .orElseGet(Produto::new);

The type Produto does not define Produto() that is applicable here

he method orElseGet(Supplier<? extends Produto>) in the type Optional is not applicable
for the arguments (Produto::new)

Estão de fato sem as aspas
As informações da lista foram passadas pelo professor desta maneira já

Mas como está o código da classe Produto?

public class Produto implements Comparable {

private Integer id_opcao;
private String sub_grupo;
private Integer quantidade;
private Integer dataInicio;
private Integer dataFim;

public Produto(int id_opcao, String sub_grupo, int i, int j, int quantidade) {
	super();
	this.id_opcao = id_opcao;
	this.sub_grupo = sub_grupo;
	this.quantidade = quantidade;
	this.dataInicio = i;
	this.dataFim = j;
}

public int getId_opcao() {
	return id_opcao;
}



public void setId_opcao(int id_opcao) {
	this.id_opcao = id_opcao;
}



public String getSub_grupo() {
	return sub_grupo;
}



public void setSub_grupo(String sub_grupo) {
	this.sub_grupo = sub_grupo;
}



public int getQuantidade() {
	return quantidade;
}



public void setQuantidade(int quantidade) {
	this.quantidade = quantidade;
}



public int getDataInicio() {
	return dataInicio;
}



public void setDataInicio(int dataInicio) {
	this.dataInicio = dataInicio;
}



public int getDataFim() {
	return dataFim;
}

public void setDataFim(int dataFim) {
	this.dataFim = dataFim;
}

@Override
public int compareTo(Produto prod2) {
	return this.sub_grupo.compareTo(prod2.sub_grupo);
}

	
@Override
public String toString() {
	return "Produto [id_opcao=" + id_opcao + ", sub_grupo=" + sub_grupo + ", Quantidade()=" + getQuantidade()
			+ "]";
}

É só pegar o primeiro elemento:

produtos.sort((p1, p2) -> p2.getQuantidade().compareTo(p1.getQuantidade()));
System.out.println(produtos.get(0)); // <-- pega o primeiro elemento

Usei get(0), porque o primeiro elemento fica no índice zero.

Ah, como você disse que tentou usar stream, então está usando Java >= 8. Por isso sugeri acima a sintaxe de lambda para criar o Comparator (que só funciona a partir do Java 8), que é mais sucinta.


Sobre isso, vi que as datas estão como Integer, e… sem comentários :man_facepalming:
Você viu que todas as datas estão com o valor zero, né? Por exemplo, 9/4/2020, é 9 dividido por 4 (que dá 2, como são int's, o valor é arredondado), e isso dividido por 2020 dá zero. Mas enfim, se é assim que o professor passou…

Deu certo, obrigada!
Alterei as variáveis em relação as datas, de fato não estava fazendo sentido.

Agora levando em consideração uma outra lista eu preciso exibir a linha que se repete mais vezes o Id_opcao

public static void main(String[] args) throws IOException {
	List<String> produtos = Files.readAllLines(Path.of("C:\\Projeto\\dados_venda.txt"));
	Collections.sort(produtos);
	
	for (String linha : produtos) {
		String [] campos = linha.split(";");
		System.out.println(campos [0]);
	}

}

public int compare(Produto prod1, Produto prod2) {
	Integer id_opcaoProd1 = prod1.getId_opcao();
	Integer id_opcaoProd2 = prod2.getId_opcao();
	
	return id_opcaoProd2.compareTo(id_opcaoProd1);
}

}

O que eu tinha pensando em fazer é identificar a frequência de cada número, depois ordenar essa lista do maior para o menor e então exibir apenas a linha em posição 0