Skip to content

Commit 395636c

Browse files
committed
Week4. Done
1 parent 10a6bc6 commit 395636c

11 files changed

+436
-22
lines changed

Week4/src/AllFilters.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import java.util.ArrayList;
2+
3+
public class AllFilters implements Filter {
4+
ArrayList<Filter> filters;
5+
6+
public AllFilters() {
7+
filters = new ArrayList<>();
8+
}
9+
10+
public void addFilter(Filter f) {
11+
filters.add(f);
12+
}
13+
14+
@Override
15+
public boolean satisfies(String id) {
16+
for (Filter f : filters) {
17+
if (!f.satisfies(id)) {
18+
return false;
19+
}
20+
}
21+
22+
return true;
23+
}
24+
}

Week4/src/DirectorsFilter.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/**
2+
* A class for filter movies by directors
3+
*
4+
* @author Stanislav Rakitov
5+
* @version 1.0
6+
*/
7+
public class DirectorsFilter implements Filter {
8+
String directors;
9+
10+
public DirectorsFilter(String directors) {
11+
this.directors = directors;
12+
}
13+
14+
@Override
15+
public boolean satisfies(String id) {
16+
String movieDirectors = MovieDatabase.getDirector(id);
17+
String[] filterDirectors = directors.split(",");
18+
for (String direcor : filterDirectors) {
19+
if (movieDirectors.contains(direcor)) {
20+
return true;
21+
}
22+
}
23+
return false;
24+
}
25+
}

Week4/src/FirstRatings.java

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@ static ArrayList<Rater> loadRaters(String fileName) {
7272
String rater_id = record.get(0);
7373
String movie_id = record.get(1);
7474
double rating = Double.parseDouble(record.get(2));
75-
String time = record.get(3);
7675
if (!idsList.contains(rater_id)) {
7776
Rater rater = new EfficientRater(rater_id);
7877
ratersList.add(rater);
@@ -90,23 +89,6 @@ static ArrayList<Rater> loadRaters(String fileName) {
9089
return ratersList;
9190
} // loadRaters
9291

93-
public ArrayList<Movie> getMovieArrayList() {
94-
return movieArrayList;
95-
}
96-
97-
public ArrayList<Rater> getRaterArrayList() {
98-
return raterArrayList;
99-
}
100-
101-
/**
102-
* This method returns number of unique Raters
103-
*
104-
* @return int number of unique raters
105-
*/
106-
public int getRatersNumber() {
107-
return ratersWithIds.size();
108-
}
109-
11092
private HashMap<String, ArrayList<String>> getAllMoviesAndRatesMap(ArrayList<Movie> moviesList) {
11193
HashMap<String, ArrayList<String>> allMoviesAndRatesTempMap = new HashMap<>();
11294
// fulfill map with all MoviesID with null ArrayList

Week4/src/FourthRatings.java

Lines changed: 92 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import java.util.ArrayList;
2-
import java.util.Collections;
32
import java.util.HashMap;
43

4+
import static java.util.Collections.reverseOrder;
5+
import static java.util.Collections.sort;
6+
57
/**
68
* The week 4 class
79
*
@@ -49,11 +51,11 @@ public ArrayList<Rating> getAverageRatingsByFilter(Integer minimalRaters, Filter
4951
}
5052
}
5153

52-
Collections.sort(ratingsList);
54+
sort(ratingsList);
5355
return ratingsList;
5456
}
5557

56-
private double dotProduct(Rater meRater, Rater otherRater) {
58+
public double dotProduct(Rater meRater, Rater otherRater) {
5759
HashMap<String, Rating> myRatings = meRater.getMyRatings();
5860
double result = 0.0;
5961
for (String id : myRatings.keySet()) {
@@ -77,7 +79,93 @@ private ArrayList<Rating> getSimilarities(String id) {
7779
}
7880
}
7981
}
80-
list.sort(Collections.reverseOrder());
82+
list.sort(reverseOrder());
8183
return list;
8284
}
85+
86+
public ArrayList<Rating> getSimilarRatings(
87+
String id, Integer numSimilarRaters, Integer minimalRaters) {
88+
ArrayList<Rating> ratingMoive = new ArrayList<>();
89+
ArrayList<Rating> ratingRater = getSimilarities(id);
90+
ArrayList<String> movies = MovieDatabase.filterBy(new TrueFilter());
91+
for (String movie_id : movies) {
92+
int md_id = Integer.parseInt(movie_id);
93+
if (hasMinRaters(movie_id, minimalRaters, numSimilarRaters, ratingRater)) {
94+
double sum = 0.0;
95+
double ave;
96+
double num = 0.0;
97+
for (int i = 0; i < numSimilarRaters; i++) {
98+
Rater rater = RaterDatabase.getRater(ratingRater.get(i).getItem());
99+
HashMap<String, Rating> movieRated = rater.getMyRatings();
100+
for (String mo_id : movieRated.keySet()) {
101+
int rm_id = Integer.parseInt(mo_id);
102+
if (rm_id == md_id) {
103+
sum += ratingRater.get(i).getValue() * rater.getRating(mo_id);
104+
num += 1;
105+
}
106+
}
107+
}
108+
if (num != 0.0) {
109+
ave = sum / num;
110+
Rating rating = new Rating(movie_id, ave);
111+
ratingMoive.add(rating);
112+
}
113+
}
114+
}
115+
ratingMoive.sort(reverseOrder());
116+
return ratingMoive;
117+
}
118+
119+
private boolean hasMinRaters(
120+
String movie_id,
121+
Integer minimalRaters,
122+
Integer numSimilarRaters,
123+
ArrayList<Rating> ratingRater) {
124+
int numOfRaters = 0;
125+
int md_id = Integer.parseInt(movie_id);
126+
for (int i = 0; i < numSimilarRaters; i++) {
127+
Rater rater = RaterDatabase.getRater(ratingRater.get(i).getItem());
128+
HashMap<String, Rating> movieRated = rater.getMyRatings();
129+
for (String mo_id : movieRated.keySet()) {
130+
int rm_id = Integer.parseInt(mo_id);
131+
if (rm_id == md_id) {
132+
numOfRaters += 1;
133+
}
134+
}
135+
}
136+
return numOfRaters >= minimalRaters;
137+
}
138+
139+
public ArrayList<Rating> getSimilarRatingsByFilter(
140+
String id, Integer numSimilarRaters, Integer minimalRaters, Filter filterCriteria) {
141+
ArrayList<Rating> ratingMoive = new ArrayList<>();
142+
ArrayList<Rating> ratingRater = getSimilarities(id);
143+
ArrayList<String> movies = MovieDatabase.filterBy(filterCriteria);
144+
for (String movie_id : movies) {
145+
int md_id = Integer.parseInt(movie_id);
146+
if (hasMinRaters(movie_id, minimalRaters, numSimilarRaters, ratingRater)) {
147+
double sum = 0.0;
148+
double ave;
149+
double num = 0.0;
150+
for (int i = 0; i < numSimilarRaters; i++) {
151+
Rater rater = RaterDatabase.getRater(ratingRater.get(i).getItem());
152+
HashMap<String, Rating> movieRated = rater.getMyRatings();
153+
for (String mo_id : movieRated.keySet()) {
154+
int rm_id = Integer.parseInt(mo_id);
155+
if (rm_id == md_id) {
156+
sum += ratingRater.get(i).getValue() * rater.getRating(mo_id);
157+
num += 1.0;
158+
}
159+
}
160+
}
161+
if (num != 0.0) {
162+
ave = sum / num;
163+
Rating rating = new Rating(movie_id, ave);
164+
ratingMoive.add(rating);
165+
}
166+
}
167+
}
168+
ratingMoive.sort(reverseOrder());
169+
return ratingMoive;
170+
}
83171
}

Week4/src/GenreFilter.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* A class for filter movies by genre
3+
*
4+
* @author Stanislav Rakitov
5+
* @version 1.0
6+
*/
7+
public class GenreFilter implements Filter {
8+
9+
private final String genre;
10+
11+
// The constructor should have one parameter named genre representing one genre,
12+
// and the satisfies method should return true if a movie has this genre.
13+
// Note that movies may have several genres.
14+
public GenreFilter(String genre) {
15+
this.genre = genre.toLowerCase();
16+
}
17+
18+
@Override
19+
public boolean satisfies(String id) {
20+
return MovieDatabase.getGenres(id).toLowerCase().contains(genre);
21+
}
22+
}

Week4/src/MinutesFilter.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* A class for filter movies by time
3+
*
4+
* @author Stanislav Rakitov
5+
* @version 1.0
6+
*/
7+
public class MinutesFilter implements Filter {
8+
private final int minMinutes;
9+
private final int maxMinutes;
10+
11+
public MinutesFilter(int minMinutes, int maxMinutes) {
12+
this.minMinutes = minMinutes;
13+
this.maxMinutes = maxMinutes;
14+
}
15+
16+
// No max minutes given
17+
public MinutesFilter(int minMinutes) {
18+
this.minMinutes = minMinutes;
19+
this.maxMinutes = Integer.MAX_VALUE;
20+
}
21+
22+
@Override
23+
public boolean satisfies(String id) {
24+
return MovieDatabase.getMinutes(id) >= minMinutes && MovieDatabase.getMinutes(id) <= maxMinutes;
25+
}
26+
}
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
import java.util.ArrayList;
2+
import java.util.Collections;
3+
4+
/** @author Stanislav Rakitov */
5+
public class MovieRunnerSimilarRatings {
6+
7+
/**
8+
* Print a list of movies and their average ratings sorted by averages
9+
*
10+
* @param minimalRatings int specified number of ratings
11+
*/
12+
public void printAverageRatings(int minimalRatings) {
13+
FourthRatings fourthRatings = new FourthRatings();
14+
ArrayList<Rating> ratedList = fourthRatings.getAverageRatings(minimalRatings);
15+
16+
Collections.sort(ratedList);
17+
// Print the number of raters after creating a ThirdsRating object.
18+
System.out.printf("Total movies with %d ratings is %d\n", minimalRatings, ratedList.size());
19+
20+
// Print the number of movies in the database.
21+
System.out.println("The number of movies in the database is " + MovieDatabase.size());
22+
23+
// You will call getAverageRatings with a minimal number of raters to return an ArrayList of
24+
// type Rating.
25+
26+
ArrayList<Rating> averageRatings = fourthRatings.getAverageRatings(minimalRatings);
27+
28+
// Print out how many movies with ratings are returned,
29+
// then sort them, and print out the rating and title of each movie
30+
System.out.printf(
31+
"How many movies with ratings %d are returned: %d%n",
32+
minimalRatings, averageRatings.size());
33+
34+
printRatingsList(averageRatings);
35+
}
36+
37+
public void printAverageRatingsByYearAfterAndGenre(int minimalRatings, int year, String genre) {
38+
FourthRatings fourthRatings = new FourthRatings();
39+
AllFilters filters = new AllFilters();
40+
filters.addFilter(new GenreFilter(genre));
41+
filters.addFilter(new YearAfterFilter(year));
42+
System.out.println(fourthRatings.getAverageRatingsByFilter(minimalRatings, filters).size());
43+
}
44+
45+
private void printRatingsList(ArrayList<Rating> averageRatingList) {
46+
System.out.printf("Found %d movie(s)%n", averageRatingList.size());
47+
averageRatingList.stream()
48+
.sorted()
49+
.forEach(
50+
rating -> {
51+
String movieID = rating.getItem();
52+
System.out.printf("%-4s %s%n", rating.getValue(), MovieDatabase.getTitle(movieID));
53+
System.out.println(" Year: " + MovieDatabase.getYear(movieID));
54+
System.out.println(" Time: " + MovieDatabase.getMinutes(movieID));
55+
System.out.println(" Genre(s): " + MovieDatabase.getGenres(movieID));
56+
System.out.println(" Director(s): " + MovieDatabase.getDirector(movieID));
57+
});
58+
System.out.println("-------");
59+
}
60+
61+
public void printSimilarRatings() {
62+
FourthRatings fourthR = new FourthRatings();
63+
MovieDatabase.initialize("ratedmoviesfull.csv");
64+
RaterDatabase.initialize("ratings.csv");
65+
ArrayList<Rating> ratingList = fourthR.getSimilarRatings("71", 20, 5);
66+
System.out.println(MovieDatabase.getTitle(ratingList.get(0).getItem()));
67+
}
68+
69+
public void printSimilarRatingsByGenre() {
70+
FourthRatings fourthR = new FourthRatings();
71+
MovieDatabase.initialize("ratedmoviesfull.csv");
72+
RaterDatabase.initialize("ratings.csv");
73+
ArrayList<Rating> ratingList =
74+
fourthR.getSimilarRatingsByFilter("964", 20, 5, new GenreFilter("Mystery"));
75+
System.out.println(MovieDatabase.getTitle(ratingList.get(0).getItem()));
76+
}
77+
78+
public void printSimilarRatingsByDirector() {
79+
FourthRatings fourthR = new FourthRatings();
80+
MovieDatabase.initialize("ratedmoviesfull.csv");
81+
RaterDatabase.initialize("ratings.csv");
82+
ArrayList<Rating> ratingList =
83+
fourthR.getSimilarRatingsByFilter(
84+
"120",
85+
10,
86+
2,
87+
new DirectorsFilter(
88+
"Clint Eastwood,J.J. Abrams,Alfred Hitchcock,Sydney Pollack,David Cronenberg,Oliver Stone,Mike Leigh"));
89+
System.out.println(ratingList.size());
90+
System.out.println(MovieDatabase.getTitle(ratingList.get(0).getItem()));
91+
}
92+
93+
public void printSimilarRatingsByGenreAndMinutes() {
94+
FourthRatings fourthR = new FourthRatings();
95+
MovieDatabase.initialize("ratedmoviesfull.csv");
96+
RaterDatabase.initialize("ratings.csv");
97+
AllFilters allFilters = new AllFilters();
98+
allFilters.addFilter(new MinutesFilter(80, 160));
99+
allFilters.addFilter(new GenreFilter("Drama"));
100+
ArrayList<Rating> ratingList = fourthR.getSimilarRatingsByFilter("168", 10, 3, allFilters);
101+
System.out.println(ratingList.size());
102+
System.out.println(MovieDatabase.getTitle(ratingList.get(0).getItem()));
103+
}
104+
105+
public void printSimilarRatingsByYearAfterAndMinutes() {
106+
FourthRatings fourthR = new FourthRatings();
107+
MovieDatabase.initialize("ratedmoviesfull.csv");
108+
RaterDatabase.initialize("ratings.csv");
109+
AllFilters allFilters = new AllFilters();
110+
allFilters.addFilter(new MinutesFilter(70, 200));
111+
allFilters.addFilter(new YearAfterFilter(1975));
112+
ArrayList<Rating> ratingList = fourthR.getSimilarRatingsByFilter("314", 10, 5, allFilters);
113+
System.out.println(MovieDatabase.getTitle(ratingList.get(0).getItem()));
114+
}
115+
}

0 commit comments

Comments
 (0)