[RESOLVIDO]Quantidade de pedidos por data

Boa tarde pessoal.

Minha dúvida não é bem quanto ao java em si, to mais travado no algoritmo mesmo. Espero que alguém possa ajudar.

Tenho uma lista de pedidos que contém para cada pedido, número do pedido, detalhes do pedido e o mais importante pra mim, a data em que o pedido foi feito.

O que eu preciso é contar por data, quantos pedidos foram realizados.

Exemplo: dia 22/05/13 foram realizados 10 pedidos, no dia 23/05/13 foram realizados 5 pedidos e por ai vai.

Não tenho problemas para percorrer a lista, exibir seu valores nem nada assim. O que não estou conseguindo entender é como vou comparar as datas para somar +1 no contador.

for (Pedidos x : listaPedidos) {
//contar quantos pedidos foram realizados em cada data. Ex: x.getDataPedidp();
}

Você sabe quais dias você precisa extrair o count? Ou você precisa isolar todos os possíveis existentes na collection?

Todos as datas possíveis existentes na collection EduFrazao.

Mas isso com intervalo de dias certo?

Como a intenção é usar isso em um calendário, acredito que possa ser definido o intervalo de datas como inicio/fim do mês corrente.

Brother, montei este exemplo pra vc:

package test;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Random;

public class CollectionFilterTest {
	
	
	public static void main(String[] args) {
		Collection<Data> data = create();
		
		Map<Date, Collection<Data>> groups = groupPerDay(data);
		
		List<Date> sortedDates = new ArrayList<>(groups.keySet());
		Collections.sort(sortedDates);
		
		DateFormat dateFormatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		System.out.println("Count's by date");
		int total = 0;
		for(Date date : sortedDates) {
			int count = groups.get(date).size();
			total += count;
			System.out.println(dateFormatter.format(date) + " - " + count);
		}
		System.out.println("Total: " + total);
		System.out.println("Total of dates: " + sortedDates.size());
	}
	
	private static Map<Date, Collection<Data>> groupPerDay(Collection<Data> data) {
		Map<Date, Collection<Data>> grouped = new HashMap<>();
		
		for(Data d : data) {
			getGroupingCollection(grouped, d).add(d);
		}
		
		return grouped;
	}
	
	private static Collection<Data> getGroupingCollection(Map<Date, Collection<Data>> map, Data data) {
		Date reference = getSameMonthDate(map.keySet(), data.getDate());
		
		Collection<Data> grouping = map.get(reference);
		if(grouping == null) {
			grouping = new ArrayList<>();
			map.put(reference, grouping);
		}
		return grouping;
	}
	
	private static Date getSameMonthDate(Collection<Date> dates, Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		int month = cal.get(Calendar.DAY_OF_MONTH);
		
		for(Date d : dates) {
			cal.setTime(d);
			if(cal.get(Calendar.DAY_OF_MONTH) == month) {
				return d;
			}
		}
		
		cal.setTime(date);
		cal.set(Calendar.MILLISECOND, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		
		return cal.getTime();
	}
	
	private static Collection<Data> create() {
		Collection<Data> data = new HashSet<>();
		for(int i = 1; i<=350; i++) {
			data.add(new Data(i, CollectionFilterTest.generateRandonDateInCurrentMonth(new Date())));
		}
		return data;
	}
	
	private static Date generateRandonDateInCurrentMonth(final Date reference) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(reference);
		Random random = new Random();
		int lowDay = 1;
		int maxDay = calendar.getMaximum(Calendar.DAY_OF_MONTH);
		
		calendar.set(Calendar.MILLISECOND, 0);
		calendar.set(Calendar.MINUTE, random.nextInt(60 - 0) + 0);
		calendar.set(Calendar.SECOND, random.nextInt(60 - 0) + 0);
		calendar.set(Calendar.HOUR_OF_DAY, random.nextInt(24 - 0) + 0);
		
		calendar.set(Calendar.DAY_OF_MONTH, random.nextInt(maxDay - lowDay) + lowDay);
		
		return calendar.getTime();
	}
	
	private static class Data {
		public Data(Integer id, Date date) {
			this.id = id;
			this.date = date;
		}
		private Integer id;
		private Date date;
		public Integer getId() {
			return id;
		}
		public void setId(Integer id) {
			this.id = id;
		}
		public Date getDate() {
			return date;
		}
		public void setDate(Date date) {
			this.date = date;
		}
		public String toString() {
			return id + " - " + date;
		}
	}
}

Criei uma lista com 350 datas no mes corrente, e depois, filtrei, agrupei e sumarizei em subcolecoes… Veja se é isso que vc precisa.

Att,

[quote=EduFrazao]Brother, montei este exemplo pra vc:

package test;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Random;

public class CollectionFilterTest {
	
	
	public static void main(String[] args) {
		Collection<Data> data = create();
		
		Map<Date, Collection<Data>> groups = groupPerDay(data);
		
		List<Date> sortedDates = new ArrayList<>(groups.keySet());
		Collections.sort(sortedDates);
		
		DateFormat dateFormatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		System.out.println("Count's by date");
		int total = 0;
		for(Date date : sortedDates) {
			int count = groups.get(date).size();
			total += count;
			System.out.println(dateFormatter.format(date) + " - " + count);
		}
		System.out.println("Total: " + total);
		System.out.println("Total of dates: " + sortedDates.size());
	}
	
	private static Map<Date, Collection<Data>> groupPerDay(Collection<Data> data) {
		Map<Date, Collection<Data>> grouped = new HashMap<>();
		
		for(Data d : data) {
			getGroupingCollection(grouped, d).add(d);
		}
		
		return grouped;
	}
	
	private static Collection<Data> getGroupingCollection(Map<Date, Collection<Data>> map, Data data) {
		Date reference = getSameMonthDate(map.keySet(), data.getDate());
		
		Collection<Data> grouping = map.get(reference);
		if(grouping == null) {
			grouping = new ArrayList<>();
			map.put(reference, grouping);
		}
		return grouping;
	}
	
	private static Date getSameMonthDate(Collection<Date> dates, Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		int month = cal.get(Calendar.DAY_OF_MONTH);
		
		for(Date d : dates) {
			cal.setTime(d);
			if(cal.get(Calendar.DAY_OF_MONTH) == month) {
				return d;
			}
		}
		
		cal.setTime(date);
		cal.set(Calendar.MILLISECOND, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		
		return cal.getTime();
	}
	
	private static Collection<Data> create() {
		Collection<Data> data = new HashSet<>();
		for(int i = 1; i<=350; i++) {
			data.add(new Data(i, CollectionFilterTest.generateRandonDateInCurrentMonth(new Date())));
		}
		return data;
	}
	
	private static Date generateRandonDateInCurrentMonth(final Date reference) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(reference);
		Random random = new Random();
		int lowDay = 1;
		int maxDay = calendar.getMaximum(Calendar.DAY_OF_MONTH);
		
		calendar.set(Calendar.MILLISECOND, 0);
		calendar.set(Calendar.MINUTE, random.nextInt(60 - 0) + 0);
		calendar.set(Calendar.SECOND, random.nextInt(60 - 0) + 0);
		calendar.set(Calendar.HOUR_OF_DAY, random.nextInt(24 - 0) + 0);
		
		calendar.set(Calendar.DAY_OF_MONTH, random.nextInt(maxDay - lowDay) + lowDay);
		
		return calendar.getTime();
	}
	
	private static class Data {
		public Data(Integer id, Date date) {
			this.id = id;
			this.date = date;
		}
		private Integer id;
		private Date date;
		public Integer getId() {
			return id;
		}
		public void setId(Integer id) {
			this.id = id;
		}
		public Date getDate() {
			return date;
		}
		public void setDate(Date date) {
			this.date = date;
		}
		public String toString() {
			return id + " - " + date;
		}
	}
}

Criei uma lista com 350 datas no mes corrente, e depois, filtrei, agrupei e sumarizei em subcolecoes… Veja se é isso que vc precisa.

Att,
[/quote]

Cara,

Exatamente isso que preciso. Soh quebrar a cabeça agora aqui pra entender. xD
Muito obrigado!

Qualquer coisa, aponta os pontos onde vc tem dúvida que te explico.

[quote=EduFrazao]Qualquer coisa, aponta os pontos onde vc tem dúvida que te explico.
[/quote]

Agradeço a boa vontade Edu. Irei analisar o código e caso tenha dúvidas, lhe pergunto.

Mais uma vez, muito obrigado!