-
Notifications
You must be signed in to change notification settings - Fork 0
/
MapDataCounter.java
99 lines (81 loc) · 3.3 KB
/
MapDataCounter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import java.util.TreeMap;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Map;
import java.util.Set;
import java.util.Comparator;
import java.util.Collections;
public class MapDataCounter<E extends Comparable<E>> implements DataCounter<E>{
//OVERVIEW: MapDataCounter implementa una struttura ordinatadi elementi E associando a loro un valore Integer
//AF: { <key_i,ogg.get(key_i)> | ogg.containsKey(key_i)==T && 0<=i<ogg.size()=n && key_i != null }
//IR: { ForAll i,j . 0<=key_i<key_j<ogg.size() => key_i!=key_j }
TreeMap<E,Integer> ogg;
public MapDataCounter(){
ogg = new TreeMap<>();
}
public MapDataCounter(List<E> ist){
ogg = new TreeMap<>();
Integer n;
//Chiama getCount che restituisce 0 se "el" non c'è, altrimenti il suo val associato
//Somma 1 e lo aggiunge direttamente (eventualmente sovrascrivendo la vecchia occorrenza)
for(E el : ist){
n=this.getCount(el)+1;
ogg.put(el,n);
}
}
//incrementa il valore associato all’elemento data di tipo E
public void incCount(E data) throws NullPointerException, MissingElementException{
if(data==null) throw new NullPointerException();
Integer n = this.getCount(data);
if(n==0) throw new MissingElementException();
else ogg.put(data,n+1);
}
//REQUIRES: data!=null && data ∈ this
//THROWS: Se (data==null) lancia una NullPointerException
// Se (data ∉ this) lancia una MissingElementException
//MODIFIES: ogg.get(data)
//EFFECTS: ogg.get(data)+1
// restituisce il numero degli elementi presenti nella collezione
public int getSize(){
return ogg.size();
}
//REQUIRES:
//THROWS:
//MODIFIES:
//EFFECTS: restituisce la cardinalità dell'insieme
//restituisce il valore corrente associato al parametro data,
// e 0 se data non appartiene alla collezione
public int getCount(E data) throws NullPointerException{
if(data==null) throw new NullPointerException();
Integer n = ogg.get(data);
if(n==null) n=0;
return n;
}
//REQUIRES: data!=null
//THROWS: se (data==null) lancia una NullPointerException
//MODIFIES:
//EFFECTS: restituisce il valore numerico associato a data se esso è presente
// altrimenti restituisce 0
// restituisce un iteratore (senza remove) per la collezione
public Iterator<Map.Entry<E,Integer>> getIterator(){
Comparator<Map.Entry<E,Integer>> cmp = new Comparator<Map.Entry<E,Integer>>(){
public int compare(Map.Entry<E,Integer> e1, Map.Entry<E,Integer> e2){
int j = e2.getValue().compareTo(e1.getValue());
if(j==0) j= e1.getKey().compareTo(e2.getKey());
return j;
}
};
//Richiama il Set navigabile dell'ogg
List<Map.Entry<E,Integer>> lst = new ArrayList<Map.Entry<E,Integer>>(ogg.entrySet());
//Ordina secondo il Comparator sopra definito
Collections.sort(lst,cmp);
MyIter<E> itr = new MyIter<E>(lst.iterator());
return itr;
}
//REQUIRES:
//THROWS:
//MODIFIES:
//EFFECTS: restituisce un Iteratore di coppie <chiave, valore> ordinato, senza la remove
}