-
Notifications
You must be signed in to change notification settings - Fork 0
/
FourthRatings.java
85 lines (81 loc) · 3.1 KB
/
FourthRatings.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
import java.util.*;
public class FourthRatings {
public double dotProduct(Rater me, Rater r){
ArrayList<String> memov = me.getItemsRated();
ArrayList<String> rmov = r.getItemsRated();
double dot = 0;
for(String mes : memov){
for(String rs : rmov){
if(mes.equals(rs)){
dot = dot + (me.getRating(rs)-5)*(r.getRating(rs)-5);
}
}
}
return dot;
}
public ArrayList<Rating> getSimilarities(String id){
ArrayList<Rating> list = new ArrayList<Rating>();
Rater me = RaterDatabase.getRater(id);
for(Rater r : RaterDatabase.getRaters()) {
double sim = dotProduct(me,r);
if(!me.getID().equals(r.getID()) && sim>0){
list.add(new Rating(r.getID(),sim));
}
}
Collections.sort(list, Collections.reverseOrder());
return list;
}
public ArrayList<Rating> getSimilarRatings(String id, int numSimilarRaters, int minimalRaters){
ArrayList<Rating> list = getSimilarities(id);
ArrayList<Rating> ret = new ArrayList<Rating>();
double total = 0;
int num = 0;
for(String movieID : MovieDatabase.filterBy(new TrueFilter())){
for(int k=0; k<numSimilarRaters; k++){
Rating r = list.get(k);
Rater ra = RaterDatabase.getRater(r.getItem());
for(String m : ra.getItemsRated()){
if(movieID.equals(m)){
num++;
total = r.getValue()*ra.getRating(movieID) + total;
}
}
}
if(num >= minimalRaters){
ret.add(new Rating(movieID, total/num));
}
num = 0;
total = 0;
}
Collections.sort(ret, Collections.reverseOrder());
return ret;
}
public ArrayList<Rating> getSimilarRatingsByFilter(String id, int numSimilarRaters, int minimalRaters, Filter filterCriteria){
ArrayList<Rating> list = getSimilarities(id);
ArrayList<Rating> ret = new ArrayList<Rating>();
double total = 0;
int num = 0;
ArrayList<String> movies = MovieDatabase.filterBy(filterCriteria);
for(String movieID : MovieDatabase.filterBy(new TrueFilter())){
if(movies.contains(movieID)){
for(int k=0; k<numSimilarRaters; k++){
Rating r = list.get(k);
Rater ra = RaterDatabase.getRater(r.getItem());
for(String m : ra.getItemsRated()){
if(movieID.equals(m)){
num++;
total = r.getValue()*ra.getRating(movieID) + total;
}
}
}
if(num >= minimalRaters){
ret.add(new Rating(movieID, total/num));
}
num = 0;
total = 0;
}
}
Collections.sort(ret, Collections.reverseOrder());
return ret;
}
}