2016-10-26 47 views
1

我想使自己的文本二進制排序方法,雖然我成功地編譯它,它並沒有真正完成排序工作,並返回空值。任何人都可以幫忙指出問題嗎?非常感謝!!(Java文本處理)排序文本方法和結果爲空?

class mergesort{

//main method 
public static void main(String [] args) throws IOException{ 

    String [] words = readWords(args[0]); 

    long t1 = new Date().getTime(); 
    mergesort(words); 
    long t2 = new Date().getTime(); 
    System.out.println("execution time:" + (t2 - t1) + " milliseconds"); 

    prWords(words); 
} 

//method for reading file 
public static String [] readWords(String fn)throws IOException{ 

    BufferedReader br = new BufferedReader(new FileReader(fn)); 
    String line = ""; 
    StringBuilder allwords = new StringBuilder(); 
    while ((line = br.readLine())!= null){ 
     String [] items = line.trim().split("\\s+"); 
     allwords.append(convertCase(items[0])+"\t"); 
     } 
     br.close(); 
     return allwords.toString().split("\t"); 
} 

//Convert Case method 
public static String convertCase(String n){ 

     String firstWd = n;   
     firstWd = n.charAt(0) + n.substring(1).toLowerCase(); 

     return firstWd; 
} 

public static String [] sortedWs = {}; 
public static void mergesort(String [] Ws){ 
    sortedWs = new String[Ws.length]; 
    mergesort(Ws, 0, Ws.length); 
} 

public static void mergesort(String [] Ws, int bgn, int end){ 
    if (end - bgn == 1) return; 
    int mid = (bgn+end)/2; 
    mergesort(Ws, bgn, mid); 
    mergesort(Ws, mid, end); 
    merge(Ws, bgn, end); 
} 

public static void merge(String [] Ws, int bgn, int end){ 

    int mid = (bgn+end)/2; 
    int b1 = bgn; 
    int b2 = end; 

    int x = 0; 

    while (b1 < mid && b2 < end) { 
     if (Ws[b1].compareTo(Ws[b2]) <= 0){ 
      sortedWs[x] = Ws[b1]; b1++; x++; 
     } else { 
      sortedWs[x] = Ws[b2]; b2++; x++; 
     } 
    } 
    //copy the rest 
    if (b1 >= mid) 
     while (b2 < end) { sortedWs[x] = Ws[b2]; b2++; x++; } 
    if (b2 >= end) 
     while (b1 < mid) { sortedWs[x] = Ws[b1]; b1++; x++; } 

    for(int i = 0; i < end-bgn; i++) { 
     Ws[bgn+i] = sortedWs[i]; 
    } 

} 

public static void prWords(String [] strs){ 

    for (String x : strs){ 
    System.out.println(x); 
    } 
} 

回答

0

這條線merge()

int b2 = end; 

我相信它應該是:

int b2 = mid; 

有了這個變化的幾個測試運行提供正確的結果上我的電腦。

+0

非常感謝,我是多麼心不在焉!大聲笑 – Yoyashi

+0

這對大多數人來說很普遍。 :-)在學習使用調試器的時候,這是一個很好的工具,可以用來排除這些小錯誤(還有更大的錯誤)。 –

+0

@Yoyashi,請原諒我提及它,但是當我審視你的問題歷史時,我認爲你忘記了將最有幫助的答案標記爲已接受? (答案左側的刻度線)[鏈接](http://stackoverflow.com/help/someone-answers) –