2016-10-26 2 views
1

Я пытаюсь создать свой собственный метод двоичной сортировки текста, хотя я успешно скомпилировал его, но он действительно не заканчивает задание сортировки и не возвращает значение null. Может кто-нибудь помочь указывать на проблему? Большое спасибо!!(Обработка текста Java) Сортировка текстового метода и результатов в null?

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

Большое спасибо, насколько я рассеян. lol – Yoyashi

+0

Это обычно для большинства из нас. :-) В какой-то момент вы научитесь использовать отладчик, это отличный инструмент для сортировки таких небольших ошибок (и больших). –

+0

@Yoyashi, извините, что я упоминал об этом, но когда я просматриваю вашу историю вопроса, мне кажется, вы забываете отметить наиболее полезные ответы, как принято? (отметьте отметку слева от ответа) [Ссылка] (http://stackoverflow.com/help/someone-answers) –

Смежные вопросы