I wrote a linked list implementation for my java class earlier this year. This is a generic class called LList. We now have to write out the merge sort algorithm for a lab. Instead of creating a new List implementation that takes Ints, I decided to just reuse the generic list I had created before.
The problem is how do I compare two generic objects? java wont let me do something like
if(first.headNode.data > second.headNode.data)
So, my question is, is their a way to implement some sort of comparison function that will work on any type of data? I tried the following:
String one, two; one = first.headNode.data.toString(); two = second.headNode.data.toString(); if(first.headNode.data.compareTo(second.headNode.data) < 0) { result.add(first.headNode.data); // remove head node. remove() takes care of list size. first.remove(1); } else { // If compareTo returns 0 or higher, second.headNode is lower or // equal to first.headNode. So it's safe to update the result // list result.add(second.headNode.data); second.remove(1); }
Which wont even work properly. I tested with the numbers 6 and 12, the above adds 12 to the result list.
Relevant stuff:
private LList<T> mergeSort(LList<T> list) { LList<T> first = new LList(); LList<T> second = new LList(); if (list.length() == 1) { return list; } int middle = list.length() / 2; second.headNode = list.getNodeAt(middle + 1); second.length = list.length() - (middle); // Set first half to full list, then remove the 'second' half. first.headNode = list.headNode; first.length = middle; first.getNodeAt(middle).next = null; // Get the splitted halves. first = mergeSort(first); second = mergeSort(second); return merge(first, second); } private LList<T> merge(LList<T> first, LList<T> second) { LList<T> result = new LList(); while((first.length > 0) && (second.length > 0)) { // Ok, lets force toString to compare stuff since generics are a pain. String one, two; one = first.headNode.data.toString(); two = second.headNode.data.toString(); if(one.compareTo(two)) < 0) { result.add(first.headNode.data); // remove head node. remove() takes care of list size. first.remove(1); } else { // If compareTo returns 0 or higher, second.headNode is lower or // equal to first.headNode. So it's safe to update the result // list result.add(second.headNode.data); second.remove(1); } } return result; }
NOTE: entire LList class can be found [here](http://rapidshare.com/files/219112739/LList.java.html MD5: BDA8217D0756CC171032FDBDE1539478)
Look into the Comparator and Comparable interfaces.
Your sort method should take Comparator or you should specify < T extends Comparable > so that the Comparable interface can be used.