I have a class Movie with a static array Movie[] movies. I implement the Comparable and i overload the method compareTo. If the likes of a movie are same with the likes of another movie then i compare them with alphabetical order. I have to create a quicksort implementation to sort an array of movies. But in line return this.compareTo(m);
i got a stack overflow Error. How i am supposed to fix this ?
public int compareTo(Movie m) {
if (this.likes == m.likes) {
//DefaultComparator cmp = new DefaultComparator();
return this.compareTo(m);
} else if (this.likes > m.likes) {
return 1;
} else {
return -1;
}
}
public static Movie[] sort(Movie[] m) {
if (m == null || m.length == 0) {
return null;
} else {
movies = m;
quicksort(0, movies.length - 1); // sort the entire array
return movies;
}
}
public static void quicksort(int left, int right) {
int i = left;
int j = right;
Movie pivot = movies[left + (right - left) / 2];
while (i <= j) {
while (movies[i].compareTo(pivot) == -1) {
i++;
}
while (movies[j].compareTo(pivot) == 1) {
j--;
}
if (i <= j) {
exch(i, j);
i++;
j--;
}
}
if (left < j) {
quicksort(left, j);
}
if (i < right) {
quicksort(i, right);
}
}
public static void exch(int i, int j) {
Movie temp = movies[i];
movies[i] = movies[j];
movies[j] = temp;
}
public int compareTo(Movie m) {
if (this.likes == m.likes) {
//DefaultComparator cmp = new DefaultComparator();
return this.compareTo(m);
} else if (this.likes > m.likes) {
return 1;
} else {
return -1;
}
}
If this.likes == m.likes
returns true, you'll start an infinite recursive loop, after all, both the 'this' and 'm' are the same in the next iteration(s), so will their values of m be. That's your problem.
In
if (this.likes == m.likes) {
return this.compareTo(m);
}
compareTo
calls itself recursively, which would cause infinite recursion, which can only end in StackOverflowError
.
You should decide how you wish to compare the two Movie
objects in case the number of likes is equal. Either compare them by another property of Movie
or return 0
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With