2017-04-21 3 views
0

(免責事項:学校のため、他のJavaユーティリティをインポートすることはできません)リンクリストのこのマージソートが正しく機能しないのはなぜですか?

リンクされたリストにソートをマージする必要があります。ここでは、次のとおりです。

class musicNode { 
String track; // The name of the track 
int played= 0; // The number of times played 
int shuffleTag= 0; // For shuffling 
musicNode next; 

public musicNode() {  // Here's how we construct an empty list. 
    next = null; 
} 
public musicNode(String t) { 
    track = t; next = null; 
} 
public musicNode(String t, musicNode ptr) { 
    track = t; next = ptr; 
} 

public boolean LTTrack(musicNode x) { // Compares tracks according to alphabetical order on strings 
    if (this.track.compareTo(x.track)<=0) return true; 
    else return false; 
} 
}; 

// This class represents a playlist; 
// We assume that each track appears at most once in the playlist 

public class MusicPlayer { 
protected musicNode head = null; // Pointer to the top of the list. 
int length=0; // the number of nodes in the list. 
boolean debug= false; 

public MusicPlayer() { 
} 
public void setToNull() { 
    head = null; 
} 
public boolean isEmpty() { 
    return head == null; 
} 

public musicNode head() { 
    return head; 
} 

void insertTrack(String name) { // Inserts a new track at the top of the list. 
    musicNode temp= new musicNode(name, head); 
    head= temp; 
    length++; 
} 

void sortTrack() { // TODO 
    musicNode main = this.head; 
    mergeSort(main); 
} 


public musicNode mergeSort(musicNode head) { 
    if ((head == null) || (head.next == null)){ 
     return head; 
    } 
    musicNode left = head; 
    musicNode right = head.next; 

    while((right != null) && (right.next != null)){ 
     head = head.next; 
     right = (right.next).next; 
    } 
    right = head.next; 
    head.next = null; 

    return merge(mergeSort(left), mergeSort(right)); 
} 

あり、また、このJUnitテスト:

public void testSortMixed() { 
    MusicPlayer trackList= new MusicPlayer(); 
    trackList.insertTrack("d"); 
    trackList.insertTrack("b"); 
    trackList.insertTrack("e"); 
    trackList.insertTrack("a"); 
    trackList.insertTrack("c"); 

    MusicPlayer trackListTwo= new MusicPlayer(); 
    trackListTwo.insertTrack("e"); 
    trackListTwo.insertTrack("d"); 
    trackListTwo.insertTrack("c"); 
    trackListTwo.insertTrack("b"); 
    trackListTwo.insertTrack("a"); 

    trackList.sortTrack(); 
    musicNode tmp= trackList.head; 
    musicNode tmp2= trackListTwo.head; 
    for(int i=0; i< 5; i++){ 
     assertEquals(tmp2.track, tmp.track); 
     tmp2= tmp2.next; 
     tmp=tmp.next; 
    } 
} 

問題は、それはあなたが挿入最後のトラックに応じてソートすることで、だけにして上から。つまり、a-fからアルファベットを挿入すると、最後に挿入するのは "c"、itllは "cdef"のみを表示します。しかし、最後のものが "a"ならば、それは意図したとおりに動作します。

どのように動作するのですか?トラックを挿入すると、リストの先頭に挿入され、終わりではなく頭になります。私はそれを乱しているかもしれないような気がする。

私はこのことについてどのように説明するのか分かりません。また、最後に挿入されたものに基づいてソートされていることを知っています(JUnitのテストでは、メイン関数を作成し、それを使って "cde"にソートします)。

+1

、質問に関連するコードを投稿しないでください。リンク。 –

+0

@AndyTurner申し訳ありませんが、スペースを節約できると思いました。コードを投稿し、リンクを削除しました –

+0

関連していませんが、慣例ではクラス名は大文字で始まります。 'musicNode'は' MusicNode'でなければなりません。もちろん – jsheeran

答えて

1

キーポイントは方法sortTrackの2行目です:

void sortTrack() { 
    musicNode main = this.head; 
    this.head = mergeSort(main); // you forgot to set the head of linked list to the merged 
} 

私は私のラップトップ、すべてでそれをテストしたのだが、今は大丈夫行くのxD

+0

。私はあなたを愛しているのだと思う。どうもありがとう! –

関連する問題