EduFrazao 24 de mai. de 2013
Você sabe quais dias você precisa extrair o count? Ou você precisa isolar todos os possíveis existentes na collection?
Aanderson 24 de mai. de 2013
Todos as datas possíveis existentes na collection EduFrazao.
EduFrazao 24 de mai. de 2013
Mas isso com intervalo de dias certo?
Aanderson 24 de mai. de 2013
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.
EduFrazao 24 de mai. de 2013
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,
Aanderson 24 de mai. de 2013
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,
Cara,
Exatamente isso que preciso. Soh quebrar a cabeça agora aqui pra entender. xD
Muito obrigado!
EduFrazao 24 de mai. de 2013
Qualquer coisa, aponta os pontos onde vc tem dúvida que te explico.
Aanderson 24 de mai. de 2013
EduFrazao:
Qualquer coisa, aponta os pontos onde vc tem dúvida que te explico.
Agradeço a boa vontade Edu. Irei analisar o código e caso tenha dúvidas, lhe pergunto.
Mais uma vez, muito obrigado!