2016-11-25 9 views
0

患者をリンクリストに追加するプログラムを作成しました。今すぐ出力を得ることができます。 は、患者の重症度が高い方から低い方へ、重症度が同じである場合にはそれに応じて患者を挿入するようにコードを修正しました。私の患者クラスには、名前、到着、重症度という3つの属性があります。実装したリンクリストクラスに患者を追加する

編集3

私はPatientクラスでcompareSeverityメソッドを追加しました。

public boolean compareSeverity(Patient other) { 
boolean result = false; 
if(other.severity > severity) { 
    result = true; 
} else if(other.severity == severity) { 
    if(other.arrival > arrival) { 
    result = true; 
    } else { 
     result = false; 
    } 
    } else { 
    result = false; 
    } 
    return result; 
} 

これはPatientNodeのコードスニペットです。

class PatientNode { 
public Patient data; 
public PatientNode next; 

public PatientNode(Patient data, PatientNode next) { 
    this.data = data; 
    this.next = next; 
    } 
} 

これはlinked listクラスのadd方法です。

public void add(String name, int severity) { 
lastArrival++; 
Patient patient = new Patient(name, lastArrival, severity); 
PatientNode current, previous; 
current = head; 
previous = null; 
if(head == null) { 
    head = current = new PatientNode(patient, head); 
    size++; 
} else { 
    while(current!=null) { 
    //previous = current; 
    if(current.data.compareSeverity(patient)) { 
    PatientNode n = new PatientNode(patient,current); 
    size++; 
    n.next = current; 
    if(previous==null) { 
     head = n; 
    } else { 
     previous.next = n; 
    } 

    return; 
    } 
    previous = current; 
    current = current.next; 
    } 
} 
} 

問題が同じseverity患者とのようだとき、私は今取得しています出力は、しかし、これです。

患者1、到着2、重大度3

患者2、到着3、重大度3

それとも、彼らは異なるがある場合:

は、私は私の出力は次のようになりたいです重症度は次のようになります。

患者1、到着2、重症度2

患者2は、重大度が同じある場合到着1、短いseverityにおいて重大度1

が降順とである必要があり、次いでarrivalに従って昇順に格納します。

重症度に応じてどのように患者を保管することができるかについてのアイデアやポインターまたは擬似コードは非常に素晴らしいものです。

+0

a working exampleを提供することができますあなたはこの自分を実装するために必要されていますか?あなたは本当に['TreeSet'](https://docs.oracle.com/javase/8/docs/api/java/util/TreeSet.html)を使用するべきです。 – 4castle

+0

はい私はこれを自分で実装する必要があります。 @ 4castle – Mooe

答えて

0

  • 条件if(other.arrival > arrival) {if(other.arrival < arrival) {であるべきで、あなただけあなたが設定する必要があるときに指定する必要があるため、あなたのif -clausesはcompareSeverity方法で単純化することができ変数を初期化したfalseではなく、trueの値。それだけでブール値を設定するため

    public boolean compareSeverity(Patient other) { 
        boolean result = false; 
        if((other.severity > severity) || (other.severity == severity && other.arrival < arrival)) { 
         result = true; 
        } 
        return result; 
    } 
    

    、あなたもそれがなってみましょうことができます。

    public boolean compareSeverity(Patient other) { 
        return (other.severity > severity) || (other.severity == severity && other.arrival < arrival); 
    } 
    
  • あなたはwhileループの後add方法であれば、条件を忘れていました。 currentnullになった場合の対処方法これはリンクされたリストに患者を挿入できなかったときに起こります。最後の要素として患者の背中に置く必要があります。

    public void add(String name, int severity) { 
        lastArrival++; 
        Patient patient = new Patient(name, lastArrival, severity); 
        if(head == null) { 
         head = new PatientNode(patient, head); 
         size++; 
        } else { 
         PatientNode current, previous; 
         current = head; 
         previous = null; 
         while(current!=null) { 
          if(current.data.compareSeverity(patient)) { 
           PatientNode n = new PatientNode(patient,current); 
           size++; 
           //n.next = current; // overkill 
           if(previous==null) { 
            head = n; 
           } else { 
            previous.next = n; 
           } 
           return; 
          } 
          previous = current; 
          current = current.next; 
         } 
         if(current == null){ 
          previous.next = new PatientNode(patient, null); 
          size++; 
         } 
        } 
    } 
    

私はあなたの更新されたコード

+0

これを私のプログラムにコピーしてください。うまくいけば、私はいくつかの良いニュースを思いつくためにベールになるでしょう。それはいくつかの問題で、私は昨日からそれに行ってきました。 – Mooe

+0

ええ、すべてうまくいきました。私はちょうどいくつかの行を置くことを忘れたと思う。それは継続的に働くことによる問題です。どうもありがとうございます。あなたはとても役に立ちました。私はあなたが 'compareSeverity'メソッドをどのように単純化したのが好きでした。再度、感謝します。 :) – Mooe

+0

それは私の喜びです:) –

1

whileループにエラーがあります。

  1. あなたがLinkedListで何かを変更したときに気をつけてください:正しいノードを変更してください。あなたのケースで現在のリストが

    node1 --> node2 --> node4 --> node5 
    

    であり、我々はちょうどこのようnode4前にリストに挿入しなければならないPatientNodenode3があるとします。

    node1 --> node2 --> **node3** --> node4 --> node5 
    

    我々は変更する必要があります物事node3nextフィールドのフィールドがnode2であるnextフィールドのみがnode3である必要があります(node4である必要があります)。
    コードを見ると、whileループには、ノードnpがあります。追加する必要がある新しいノードと、繰り返し中の現在のノードです。

    n.next = p.next; 
    p.next = n; 
    

    これは間違っている:ループでは、npの前に来る必要があり、それが持っているとき、あなたはこれを行うかどうかを確認します!この例のnode3node4とを比較すると、npより前に来る必要があり、node3node4の前に来る必要があります。したがってnnode3に対応し、pはnode4に対応します。 pの親のnextフィールド(node2に相当)nノードのフィールドのみを変更する必要があります。 pに触れる必要はありません。これを解決するには、whileループのif文を簡単に変更することができます。p.datap.next.dataに変更します。

  2. あなたのループにはもう1つエラーがあります。これは、患者が追加された場所には、より高い数字のarrivalが付いています。しかし、私は可能な限りbreaksを使用することをお勧めします。あなたがループ状態にadded -variable使用にその値を設定しているとして:while(p.next!=null && !added){

  3. これは、より多くのアドバイスです:だけでififとして唯一のものを使用するのではなく、適切なelse if -conditionを使用しますelseにある物 - 句!

  4. これはまたアドバイスです。最後のノードが最初のノード(head)へのポインタを保持するLinkedListを強く拒否します。特に、headが変更された場合、その最後の要素の値をnextの値に更新するコードがないためです。これには、最終的には(espacially再帰の場合にエラーをStackOverflowの)

を(最後の要素ではなく、最初の2番目の要素を指すように)非常に奇妙な結果を生成することがありましたし、十分ではありません注意が払われている場合は、別のエラーにつながることができますあなたのadd -functionは次のようになります。私は、それぞれの場合にsize++を戻す

public void add(String name, int severity) { 
    Patient patient; 

    lastArrival++; 
    patient = new Patient(name, lastArrival, severity); 
    PatientNode n = new PatientNode(patient, null); 

    if(head==null) { 
     head = n; 
     size++; 
     return; 
    } else if(n.data.getSeverity() > head.data.getSeverity()) { 
     n.next = head; 
     size++; 
     head = n; 
     return; 
    } 

    PatientNode p = head; 
    boolean added = false; 
    while(p.next!=null && !added) { 
     if(p.next.data.getSeverity() < severity) { 
     n.next = p.next; 
     p.next = n; 
     added = true; 
     } else if(p.next.data.getSeverity()== severity && p.next.data.getArrival() > lastArrival) { 
     n.next = p.next; 
     p.next = n; 
     added = true; 
     } 
     p=p.next; 
    } 
    if(!added) { 
     p.next = n; 
    } 
    size++; 
} 

あなたのコードをコピーして私が提案したminimal working codeの修正内容でコピーしました。私はあなたが投稿メソッドと3つのフィールド(namearrivalseverity)で、最小フィールド(headsizelastArrivalのみadd機能)を持つクラスLinkedPatientsとクラスPatientを作成しました。私はあなたが投稿した最初の出力であなたの3つのシナリオを作り直そうとしました(あなたは一種のremoveメソッドを持っているようですが、あなたはそれを投稿しなかったので、最後のケースは完全に同じではありません)。リンクをたどり、出力を確認することができます。その中にcompareSeverityであなたのコード更新後

関連する問題