package FOM;
import java.util.ArrayList;
import java.util.Iterator;
import Util.DTMatrix;
/**
* Classe che conserva sia le frequenze singole che quelle congiunte
* @param <E> Classe degli oggetti di cui si vuole conservare la frequenza
*/
public class TermFrequencies<E> extends DTMatrix<E> implements Iterable<E> {
/**
* Costruttore base
*/
public TermFrequencies(){
super();
}
/**
* Costruttore
* @param size Grandezza iniziale della matrice delle frequenze
*/
public TermFrequencies(int size){
super(size);
finalValues = false;
}
/**
* Aggiunge un occorrenza del termine passato per parametro
* @param term Termine da aggiornare
* @return true se è stato possibile aumentare il conteggio,
* false altrimenti
*/
public boolean addOccurrence(E term){
if(finalValues)
return false;
add(term, 1);
return true;
}
/**
* Aggiunge un occorrenza per una coppia di termini
* @param firstTerm primo termine della coppia
* @param secondTerm secondo termine della coppia
* @return true se è stato possibile aumentare il conteggio,
* false altrimenti
*/
public boolean addOccurrence(E firstTerm, E secondTerm){
if(finalValues)
return false;
add(firstTerm, secondTerm, 1);
return true;
}
/**
* Metodo che segnala la fine del conteggio dei termini
* e calcola quindi le frequenze relative
* @return false se il metodo è già stato chiamato in precedenza
*/
public boolean computeFrequencies(){
if(finalValues)
return false;
normalizeBy(totWindows);
finalValues = true;
return true;
}
/**
* Aumenta il totale di finestre di testo
* @return true se è stato possibile modificare il valore, false altrimenti
*/
public boolean augmentWindows(){
if(finalValues)
return false;
totWindows += 1;
return true;
}
/**
* Restituisce la frequenza relativa di un termine
* @param term Termine di cui si vuole conoscere la frequenza
* @return Frequenza relativa del termine, -1 se il conteggio non è ancora
* finito, -2 se il termine non esiste
*/
public double getFrequency(E term){
if(!finalValues)
return -2;
return getValue(term);
}
/**
* Restituisce la frequenza relativa di una coppia di termini
* @param firstTerm primo termine della coppia
* @param secondTerm secondo termine della coppia
* @return frequenza relativa della coppia, -1 se il conteggio non è ancora
* finito, -2 se uno dei termini non esiste
*/
public double getFrequency(E firstTerm, E secondTerm){
if(!finalValues)
return -2;
return getValue(firstTerm, secondTerm);
}
public int getTotWindows(){
return totWindows;
}
public boolean filterTerms(double lower, double upper){
double f;
int i;
if(!finalValues)
return false;
for(E term: terms){
f = getFrequency(term);
if((f < lower || f > upper)){
System.out.println("Elimino " + term +" che aveva frequenza " + f);
i = terms.indexOf(term);
terms.set(i, null);
}
}
return true;
}
@Override
public Iterator<E> iterator() {
return getTerms().iterator();
}
public ArrayList<E> getTerms(){
ArrayList<E> notNull = new ArrayList<E>();
for(E term: terms){
if(term != null)
notNull.add(term);
}
return notNull;
}
private int totWindows; // Numero totale di finestre di testo, necessario per calcolare le frequenze relative
private boolean finalValues; // Flag che indica se i valori sono definitivi e possono essere letti
}