Как применить selectionsort в Java из массива объектов, преобразовав его в узлы в виде связанного списка с результатом, преобразованным в очередь? - PullRequest
0 голосов
/ 20 ноября 2018

В коде есть класс под названием selectionsorter, который в основном должен правильно применять алгоритм selectionsort.Чтобы это сделать, нужно взять массив объектов, преобразовать этот массив в связанный список, используя узлы, а затем отсортировать этот список, используя метод сортировки, в котором в качестве аргумента используется пользовательский компаратор, исходящий из интерфейса компаратора.

Этот результат затем должен быть возвращен в виде очереди, помещая наименьший объект первым.Теперь я попробовал несколько вещей, но я просто не могу заставить его работать, я понимаю концепцию, только весь связанный список делает его чертовски запутанным.Я также написал для него тест, который сортирует целые числа, но этот класс должен иметь возможность сортировать любой объект.Также следует помнить о стабильности, что означает, что если вы сортируете массив строк, таких как «AA» и «AB», AA должны стоять на первом месте в списке, даже если они оба начинаются с буквы A.

Любая помощь будет приветствоваться, посколькуЯ действительно пытался часами, я просто застрял.

package basicsort;

import java.util.Comparator;
import sort.Queue;
import sort.Sort;

/**
 *
 * 
 */
public class SelectionSorter<T> implements Sort {

private Node<T> list = new Node<>(null);

private static class Node<T> {

    T item;
    Node<T> next;

    // creation of node object with the item
    Node(T item) {
        this.item = item;
        next = null;
    }

    void print(){
        print(this);
    }

    private void print(Node item){
        System.out.println(item.item);
        if (item.next != null) {
            print(item.next);
        }
    }
}

public SelectionSorter(T[] objects) {

    if (objects.length != 0) {

        Node<T> temp = list;
    for (int i = 0; i < objects.length; i++) {
        // filling current node with object of array
        temp.next = new Node<>(objects[i]);
        temp = temp.next;
    }
    }


    // in the constructor the items from
//the array are copied to the internal datastructure based on a list using nodes. 
}

// smallest item front of the queue
@Override
public Queue sort(Comparator comparator) {
    list.print();
    // temp value for swapping
    T temp;
    Node<T> min;
    Queue<T> sorted = new Queue<>();
    for (Node<T> node1 = list; node1.next != null; node1 = node1.next) { //loopt niet fatsoenlijk
        min = node1;
        for (Node<T> node2 = node1.next; node2.next != null; node2 = node2.next) {
            //System.out.println(node2.next.item +""+ min.next.item);
            if (comparator.compare(node2.next.item, min.next.item) < 0) {
                min = node2;
            }

        }
        temp = node1.item;
        node1.item = min.item;
        min.item = temp;
        sorted.put(node1.item);
    }
    // take the node
    // compare nodes using compare method
    // put sorted nodes into queue smallest first
    // set minimum value
    // irate through comparing each element to min value
    // set compared element to min value if its smaller
    // once done mark first element as done
    // set min value to 2nd element of the list
    // return this queue  

    return sorted;
}

}


@Test
public void sortTest() {
    Integer[] objects = new Integer[]{
        1, 5, 6, 4, 9, 7
    };
    Integer[] sortedObjects = new Integer[]{
        // put objects here in correct order
        1, 4, 5, 6, 7, 9
    };
    // correct queue for comparison
    Queue sorted = new Queue();
    for (Object ob : sortedObjects) {
        sorted.put(ob);
    }
    Comparator<Integer> comparator = new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return o1.compareTo(o2);
        }

    };
    SelectionSorter<Integer> instance = new SelectionSorter(objects);
    //instance.sort(comparator);
    Queue result = instance.sort(comparator);
    result.print();
//        assertEquals(sorted, result);
//        
//        assertEquals(sorted.get(), result.get());
//        assertEquals(sorted.get(), result.get());
//        assertEquals(sorted.get(), result.get());
//        assertEquals(sorted.get(), result.get());
//        assertEquals(sorted.get(), result.get());
//        assertEquals(sorted.get(), result.get());

}
...