sabato 10 settembre 2011

cercare data più vicina in una lista di date

Immaginate di avere una lista ordinata di date.
Immaginate di dover trovare la data nella lista + vicina alla data proposta.


  • Utilizziamo un TreeSet per le funzioni lower e higher (per trovare la data nella lista che la precede e la data nella lista successiva) e joda-time per calcolare gli intervalli tra le date
  • calcoliamo la distanza tra la data  proposta e le due date precedente e successivo
  • restituiamo come risultato la data che genera intervallo di minore durata.
Ecco l'esempio intero...si capisce al volo.. [nel codice vanno gestite le eccezioni ...es. lista date vuota...]



package by.giava.mytrips.test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TreeSet;

import org.joda.time.DateTime;
import org.joda.time.Interval;

public class DateTree {
private TreeSet<Date> treeset;

public DateTree() {
this.treeset = new TreeSet<Date>();
}

public void reset() {
this.treeset = new TreeSet<Date>();
}

public void add(Date data) {
getTreeset().add(data);
}

public TreeSet<Date> getTreeset() {
return treeset;
}

public void setTreeset(TreeSet<Date> treeset) {
this.treeset = treeset;
}

public Date nearest(Date data) {
DateTime dataF = new DateTime(data);

Date dataMin = getTreeset().lower(data);
DateTime dataMinJ = new DateTime(dataMin);

Date dataMax = getTreeset().higher(data);
DateTime dataMaxJ = new DateTime(dataMax);

Interval periodMin = new Interval(dataMinJ, dataF);
Interval periodMax = new Interval(dataF, dataMaxJ);

if (periodMin.toDurationMillis() <= periodMax.toDurationMillis()) {
return dataMin;
} else {
return dataMax;
}
}

public static void main(String[] args) throws ParseException {
SimpleDateFormat form = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
DateTree dat = new DateTree();
dat.add(form.parse("01-01-2011 10:30:00"));
dat.add(form.parse("01-01-2011 10:50:00"));
dat.add(form.parse("01-01-2011 11:00:00"));

Date result = dat.nearest(form.parse("01-01-2011 10:56:00"));
System.out.println(result);
}
}

Nessun commento: