2016-12-17 13 views
0

Мои требования к назначению структуры данных Java - это создание управления питанием для назначения пищи жертве стихийного бедствия, а также для обработки трех типов жертв, которые являются дочерними, oldFolks и взрослый.LinkedList добавляет новый узел на основе номера приоритета

То, что я хотел достичь, это сказать, что у меня есть LinkedList, чтобы упорядочить приоритеты. Итак, теперь у меня есть объект Person, который опущен до Victim и Patient. Мне нужно обращаться с жертвой.

объект Victim

  • setPriority (здесь я категории потерпевший в приоритете 1,2,3, которые child, oldfolks и adults на основе их DOB)

Так теперь я иметь объект жертвы и приоритет.

Моя идея в связанном списке ADT, я делит его на 3 части, которые являются первыми child, 2nd is oldfolks и 3rd is adults.

enter image description here

Выше картина моей идеи, при добавлении новой жертвы и приоритет 2, мне нужно, чтобы получить последний старый народ, а затем положить новую жертву на спине, а затем увеличивает lastOldFolk место нахождения.

Ниже то, что я сделал до сих пор: -

public boolean addByPriority(T newEntry, int priority) { 
     Node newNode = new Node(newEntry); 
     System.out.println(firstNode); 

     if (firstNode == null) {//if empty list then straight away assign 
      firstNode = newNode; 
      switch (priority) {//update the last location of each priorities 
       case 1: 
        lastChild++; 
        lastSenior++; 
        lastAdult++; 
        break; 
       case 2: 
        lastSenior++; 
        lastAdult++; 
        break; 
       case 3: 
        lastAdult++; 
        break; 
      } 
      return true; 
     } else if (firstNode != null && priority == 1) {//if priority is 1 then add here 
      Node node = firstNode; 
      for (int i = 0; i < lastChild; i++) { 
       node = node.next; 
      } 
      Node savedNext = node.next; 
      node.next = newNode; 
      node.next.next = savedNext; 
      lastChild++; 
     } else if (firstNode != null && priority == 2) { 
     } else { 
     } 
     length++; 
     return true; 
    } 

Так что теперь в моей основной программе, я добавил 3 каждые приоритеты после этого я добавить еще newEntry с приоритетом 1, он будет хранить на 4-е позиции приоритета 1, но не работает, если я добавлю еще один новый приоритет 1. Я новичок в структуре данных, надеюсь, кто-то может просветить меня.

P/S: Мне не разрешено использовать arraylist или любой Java API для выполнения задачи, я должен создать свой собственный ADT для решения проблемы. Благодарю.

+0

Вы проверили мое решение? –

+0

@RanKoretzki Я только что вернулся домой с обеда. Я сейчас пытаюсь это сделать. Благодарю. –

ответ

0

Поскольку вы просматриваете список и не напрямую обращаетесь к месту размещения, нет необходимости отслеживать последний из <> каждого типа.

Вы можете сделать простой цикл while, пока не достигнете узла, приоритет которого ниже , чем новый узел или нуль, то есть когда вы должны добавить новый узел. , если список равен нулю, просто поместите новый узел.

if (firstNode == null) {//if empty list then straight away assign 
    firstNode = newNode; 
} else { 
    if (newNode.getPriority() < firstNode.getPriority()) { 
      newNode.next = firstNode; 
      firstNode = newNode; 
    } else { 
     Node current = firstNode; 
     while (current.getNext() != null && newNode.getPriority() >= current.getNext().getPriority()) 
      current = current.getNext(); 
     } 
     newNode.setNext(current.getNext()); 
     current.setNext(newNode); 
    } 
} 
+0

Привет, Я создаю универсальный тип данных ADT, а метод getPriority() - из подкласса Person, который является 'Victim', и я определю приоритет' Victim' перед тем, как перейти в ADT, который был показан на мой вопрос 'public boolean addByPriority (T newEntry, int priority)'. Благодарю. –

+0

Я пробовал свой код, он работает, но он устроен неправильно. Приоритет 1 - это приоритет, а затем приоритет 2 и приоритет 3. Я случайно добавил 4 записи: приоритет 1, приоритет 2, приоритет 3 и приоритет 2, а результат не был p1, p2, p2, p3, но p3, p2, p2, p1 , Вы можете мне помочь? –

+0

зафиксировал его в условии if. Проверь сейчас. –

0

Ваше решение кажется излишне сложным; я бы просто создал класс, скажем, Line, который содержит 3 независимых списка. Что-то вроде этого:

class Line { 
    private ArrayList<Victim> children; 
    private ArrayList<Victim> oldFolks; 
    private ArrayList<Victim> adults; 

    public void addByPriority(Victim newEntry, int priority) { 
     switch(priority) { 
     case 1: 
      children.add(newEntry); 
     break; 
     case 2: 
      oldFolks.add(newEntry); 
     break; 
     case 3: 
      adults.add(newEntry); 
     break; 
    } 

    public void nextPatient() { 
     if(!children.isEmpty()) return children.remove(0); 
     if(!oldFolks.isEmpty()) return oldFolks.remove(0); 
     if(!adults.isEmpty()) return adults.remove(0); 
     return null; // or throw exception, as you like 
    } 
} 

Здесь я использовал ArrayList, но там наверняка какой-либо другой реализации библиотеки Java стека (как this one), который больше подходит для этой цели.

Вы можете даже сделать класс Line реализовать list interface, так что вы можете использовать его как любой другой стандартный список (вам нужно будет переопределить методы, хотя, принимать во внимание 3 очереди)

Надежда это help

+0

Привет, спасибо за ваше решение, но я забыл упомянуть, мне не разрешено использовать arraylist или любой Java API, я должен создать себя. –

+0

идея по-прежнему применяется, если вам это нравится, просто замените ArrayList своим собственным классом Stack, который использует обычный обычный массив ... что более или менее то, что делает ArrayList (за исключением управления памятью по мере роста списка) – Antiphon0x

+0

Хорошо, я постараюсь сделать это по-твоему. Благодаря! –