Автоматическая сортировка объектов по полям при добавлении в Единый связанный список? - PullRequest
0 голосов
/ 07 февраля 2019

Я пишу Единый связанный список, который имеет возможность сортировки объектов по определенному полю, когда они вводятся в список.Это не добавление всего, затем сортировка, но проверка, куда это будет добавлено, прежде чем фактически добавить это.С этим я разработал регулярное выражение для трех различных типов отсортированных списков.Мой вопрос касается именно автоматической сортировки объектов по переменной при их добавлении.

private void addDescending(E item)
{
     if(head == null)
     {
          head = new Node<E>(item, null);
          size++;
     }
     else
     {
          Node<E> p = head;
          while(p.next != null)
          {
               if(p.data.compareTo(item) > 0)
               {
                    Node<E> n = findPrev(p);
                    if(n == null)
                    {
                         Node<E> p1 = head;
                         head = new Node<E>(item, p1);
                         size++;
                         break;
                    }
                    n.next = new Node<E>(item, p);
                    size++;
                    break;
               }
          }
     }
}

public int compareTo(Object o)
{
     if(init == ((Person)(o)).getAge())
     {
          return 0;
     }
     else if(init > ((Person)(o)).getAge())
     {
          return 1;
     }
     else
     {
          return -1;
     }
}

Метод compareTo(Object o) находится в классе Person.findPrev(Node<E> currentNode) аналогично node.previous в двойном связном списке.Для моего проекта проще реализовать Единый связанный список.

Доступ закрыт для класса, но есть public add(E item).Во-первых, он проверяет, является ли голова нулевой, создавая ее, если она не существует.Если голова существует, она сравнивается с головой.Код сравнения находится в классе Person.

Он проверяет p.data, отмеченный как Person, чтобы получить его и сравнить его с Person возрастом добавляемого объекта.Если оно больше, оно идет раньше.Если оно меньше, оно идет после.Если он находится между, он идет перед большим числом и перед меньшим числом.Это означает, что голова может быть меньше, чем добавленное число, и, таким образом, новая голова становится большим числом, а старая голова становится следующей.

В моем основном я добавляю четыре Person объекта.Они имеют возраст 3, 10, 9 и 6 лет в качестве тестов.Поскольку имена не важны, это просто Test1 - Test4.По какой-то причине, это только добавление первого объекта.В нескольких случаях мне приходилось добавлять четыре объекта, но четыре одинаковых объекта, хотя все четыре разные.Зачем добавлять несколько раз один и тот же объект или только один объект?

Редактировать: Я только что переделал и обновил код.Вот теперь метод addDescending(E item).

private boolean addDescending(E item)
{
    if(head == null)
    {
        head = new Node<E>(item, null);
        size++;
    }
    else
    {
        Node<E> p = head;       
        if(head.next == null && p.data.compareTo(item) > 0)
        {
            p.next = new Node<E>(item, null);
            head = p;
            size++;
            return true;
        }
        else if(head.next == null && p.data.compareTo(item) < 0)
        {
            head.next = new Node<E>(item, null);
            size++;
            return true;
        }

        while(p.next != null && p.data.compareTo(item) < 0)
        {                                       
            if(p.data.compareTo(item) > 0)
            {
                Node<E> n = findPrev(p);
                Node<E> p1 = p.next;
                p.next = new Node<E>(item, p1);
                size++;
                return true;
            }
        p = p.next;
        }
    }
    return false;
}

Этот код проверяет возраст объекта каждого узла по отношению к возрасту ввода.Если текущий объектный возраст объекта больше, чем вход, он переходит к следующему узлу, пока не найдет тот, который меньше его.Затем он получает предыдущий и следующий узлы, создавая новый узел и помещая себя между этими двумя.

Тем не менее, мои входные данные все еще являются четырьмя объектами Person.Я добавляю возрасты 3, 10, 9 и 6 по порядку.

Ожидаемый результат - сначала создать голову с age объекта как 3. Затем при добавлении 10, 10 больше, чем3, так что он будет добавлен перед головой, став новой головой.6 будет добавлено, проверьте против 10, и, поскольку 10 больше 6, перейдите к следующему узлу.Следующий узел, 3, меньше 6, поэтому он будет добавляться прямо между 10 и 3. Аналогично с 9, но между 10 и 6.

Проблема в том, что я не совсем уверен.Как я уже сказал, у меня есть четыре входа.Я получаю два объекта сейчас, но они оба одинаковы.Объект с name = "Test1"; и age = 3;.Я не вижу никаких других объектов, кроме этих двух, и я могу гарантировать, что они вводятся только один раз каждый.

Edit2: вот код, который создает объекты Person, регулярное выражение для конструктора списка, get,результат get и вывод.

Конструктор и регулярное выражение:

public LList(String regex) throws IllegalArgumentException
{
    size = 0;
    this.regex = regex;
    head = null;
    if(!(regex.equals("A") || regex.equals("D") || regex.equals("U")))
    {
        throw new IllegalArgumentException("Unexpected Regex");
    }
}

public void add(E item)
{
    if(regex.equals("D"))
    {
        addDescending(item);
    }
    else if(regex.equals("A"))
    {
        addAscending(item);
    }
    else if(regex.equals("U"))
    {
        addUnsorted(item);
    }
}

Get:

public E get(int index)
{
    int i = 0;
    Node<E> p = head;
    if(index == 0 && head != null)
    {
        return head.data;
    }
    else
    {
        while(p.next != null)
        {
            if(i == index)
            {
                return p.data;
            }
            p = p.next;
            i++;
        }
    }
    return null;
}

Main:

Person ch0 = new Person("Test1", 3);
Person ch1 = new Person("Test2", 10);
Person ch2 = new Person("Test3", 9);
Person ch3 = new Person("Test4", 6);

// Create Descending Order List
System.out.printf("Descending List%n%n");
System.out.printf("%-10s %-4s%n", "Name", "Age");
System.out.printf("%-10s %-4s%n", "----------", "---");

LList<Person> dList = new LList<Person>("D");
dList.add(ch0);
dList.add(ch1);
dList.add(ch2);
dList.add(ch3);


dList.get(0).print();
dList.get(1).print();
dList.get(2).print();
dList.get(3).print();

Способ печати человека:

System.out.printf("%-10s %-4d%n", name, age);

Спасибо за помощь!

1 Ответ

0 голосов
/ 07 февраля 2019

мои 2 кт:

private boolean addDescending(E item){
    if(head == null){ //case new list
        head = new Node<E>(item, null);
        size++;
        return true;
    } else if(head.data.compareTo(item)>0){ // case insert befor head
        head = new Node<E>(item, head);
        size++;
        return true; 
    } else {
        Node<E> p; 
        for(p = head;p.next!=null; p=p.next){//compare all except head
           if(p.next.data.compareTo(item) > 0){
              p.next = new Node<E>(item, p.next);
              size++;
              return true;
           }
         }
         //not found: insert at the end
         p.next = new Node<E>(item, null);
         size++;
         return true;
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...