2016-12-17 18 views
0

내 Java 데이터 구조 할당 요구 사항은 자연 재해의 희생자에게 음식을 할당하는 음식 관리를 만드는 것이고 어린이, oldFolks 및 victim 인 피해자의 3 가지 유형을 처리해야합니다. 성인.LinkedList 우선 순위 번호를 기준으로 새 노드 추가

내가 달성하고 싶었던 것은 내가 우선 순위를 정렬하기 위해 LinkedList를 가지고있다. 이제 VictimPatient으로 다운 캐스트 한 Person 개체가 있습니다. 희생자를 처리해야합니다.

피해자 객체

  • setPriority (나는 여기 카테고리 child, oldfolksadults 자신의 생년월일을 기준으로 우선 순위 1,2,3에 피해자) 그래서 지금

을 나는 것 희생자 물체와 그것의 우선 순위를 가져라.

내 아이디어는 연결 목록 ADT에 있는데, 나는 먼저 child, 2 번째가 oldfolks, 3 번째가 adults 인 세 부분으로 나눈다. 새로운 피해자를 추가하고 우선 순위를 둘 때

enter image description here

위 내 생각의 사진입니다, 나는 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) 그 후 나는 우선 순위 1과 다른 newEntry를 추가 추가, 그것은 4 위치에 저장합니다 우선 순위가 1이지만 다른 새로운 우선 순위 1을 추가하면 작동하지 않습니다. 데이터 구조가 새롭습니다. 누군가가 나를 계몽 할 수 있기를 바랍니다.

P/S : 나는 arraylist 또는 Java API를 사용하여 작업을 완료 할 수 없으며 문제를 해결하기 위해 자체 ADT를 만들어야합니다. 감사.

+0

내 솔루션을 확인하셨습니까? –

+0

@RanKoretzki 방금 저녁 식사에서 집에 왔습니다. 나는 지금 그것을 시험해보고있다. 감사. –

답변

0

목록을 스캔하고 배치 위치에 직접 액세스하지 않으므로 각 유형의 마지막에 추적 할 필요가 없습니다. <>

당신은 새로운 노드보다 낮은 보다 낮은 우선 순위의 노드에 도달 할 때까지 간단한 while 루프를 수행 할 수 있습니다. 즉, 새 노드를 추가해야하는 경우입니다. 목록이 null이면 새 노드를 넣으십시오.

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'에서 가져온 것으로, ADT로 전달되기 전에'Victim'의 우선 순위를 결정할 것입니다. 내 질문'public boolean addByPriority (T newEntry, int 우선 순위)'. 감사. –

+0

나는 당신의 코드를 시도했다, 그것은 작동하지만 잘못된 방향으로 배열되어있다. 우선 순위 1은 최우선 우선 순위 인 우선 순위 2와 우선 순위 3입니다. 우선 순위 1, 우선 순위 2, 우선 순위 3, 우선 순위 2라는 4 개의 항목을 무작위로 추가했으며 결과는 p1, p2, p2, p3가 아니고 p3, p2, p2, p1 . 너 나 좀 도와 줄 수있어? –

+0

은 if 조건으로 고정되었습니다. 지금 확인하십시오. –

0

솔루션이 불필요하게 복잡해 보입니다. 내가 할 수있는 것은 3 개의 독립적 인 목록을 보유하고있는 Line이라는 클래스를 만드는 것입니다. 이런 식으로 뭔가가 :

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를 사용하지만, 목적에 더 적합 스택 (같은 this one)의 확인 다른 자바 라이브러리 구현을 위해 존재한다.

당신은 라인 클래스 (당신이 3 큐 고려해야하지만 메소드를 오버라이드 (override) 할 필요가 있습니다) 그래서 당신은 여전히 ​​다른 표준 목록으로 사용할 수

희망이를 list interface을 구현 할 수있다 도움이

+0

안녕하세요, 귀하의 솔루션을 주셔서 감사합니다.하지만 arraylist 또는 Java API를 사용하도록 허용되지 않았 음을 언급하는 것을 잊어 버렸습니다. 직접 작성해야합니다. –

+0

당신이 원한다면 아이디어가 여전히 적용됩니다. ArrayList를 내부적으로 간단한 일반 배열을 사용하는 자신의 Stack 클래스로 대체하십시오. ArrayList와는 다소 차이가 있습니다 (목록이 커짐에 따라 메모리 관리 제외) – Antiphon0x

+0

좋아, 나는 그것을 너의 방식으로하려고 노력할 것이다. 감사! –