Я написал реализацию связанного списка для моего класса Java в начале этого года. Это общий класс LList. Теперь нам нужно записать алгоритм сортировки слияния для лаборатории. Вместо создания новой реализации List, которая принимает Ints, я решил просто повторно использовать общий список, который я создал ранее.Сравнение элементов в общем списке
Проблема заключается в том, как я могу сравнить два общих объектов? ява обыкновение позвольте мне сделать что-то вроде
if(first.headNode.data > second.headNode.data)
Итак, мой вопрос, является ли их способ реализовать какую-то функцию сравнения, которая будет работать на любом типе данных? Я пробовал следующее:
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);
}
Какой из них даже нормально работает. Я тестировал с номерами 6 и 12, выше добавляет 12 в список результатов.
Соответствующий материал:
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;
}
Примечание: весь класс LLIST можно найти [здесь] (http://rapidshare.com/files/219112739/LList.java.html MD5: BDA8217D0756CC171032FDBDE1539478)
Если вы хотите «обмануть», посмотрите на источник java для чего-то вроде Collections.sort(). Когда вы устанавливаете JDK, должна быть возможность установить источник. Тогда в каталоге установки будет файл src.jar. Файл .jar можно переименовать в .zip и открыть в WinZip. – Kip