2014-02-11 2 views
0

У меня возникли проблемы с составлением кода, который я написал. Код предназначен для сортировки массива каталогов, а затем возврата отсортированного массива. Массивы передаются в программу выглядеть следующим образом: {"/","/usr/","/usr/local/","/usr/local/bin/","/games/","/games/snake/","/homework/","/temp/downloads/"}Java Embedded Comparator Class

Отсортированного ответ на это было бы:

{ "/", "/games/", "/homework/", "/usr/", "/games/snake/", 
    "/temp/downloads/", "/usr/local/", "/usr/local/bin/" } 

Так в основном, каталоги, которые являются наименее глубоко помещены в первой очереди. Если два каталога имеют одинаковую глубину, мы сортируем их в алфавитном порядке в зависимости от первого слова. Мой код до сих пор это:

import java.util.Arrays; 
import java.util.Comparator; 

public class Dirsort { 

    class APTComp implements Comparator<String> { 

     public int compare(String a, String b) { 
      String[] d1 = a.split("/"); 
      String[] d2 = b.split("/"); 
      int diff = d1.length - d2.length; 

      if (diff != 0) { 
      return diff; 
      } //{"/","/usr/","/usr/local/","/usr/local/bin/","/games/","/games/snake/","/homework/","/temp/downloads/"} 

      return a.compareTo(b); 
     } 



     public String[] sort(String[] dirs) { 
     Arrays.sort(dirs); 
     return dirs; 
     } 
} 

Может вы, ребята, скажите мне, что вы найдете здесь не так? Использует ли мой вызов Arrays.sort() мой метод сравнения modifiend?

Спасибо большое, Junaid

ответ

2

По умолчанию метод Arrays.sort() использует естественный порядок сортировки. Поскольку массив в вашем случае имеет String, по умолчанию он будет сортироваться в соответствии с алфавитным порядком String.

Чтобы получить нужный результат, вам необходимо передать экземпляр пользовательской реализации компаратора в Array.sort().

Замените метод public String[] sort(String[] dirs) в APTComp классе с этим:

public String[] sort(String[] dirs) 
{ 
    Arrays.sort(dirs, new APTComp()); 
    return dirs; 
} 
+0

Привет. Поэтому я запустил его снова и сейчас, код просто сортируется по алфавиту, а не по глубине каталога. Глубина директории должна быть первым критерием, используемым для сортировки массива. Что-то не так с моим методом компаратора? – user2904796

+0

Реализация метода компаратора выглядит неплохо. Вышеуказанный метод дает мне правильный результат. Полученный массив дает это / /игры/ /домашние задания/ /USR/ /игры/змея/ /темп/загрузки/ /USR/местные/ /USR/местные/бен / –

0

Arrays.sort не сортировать по вашим компаратор непосредственно, кроме вы звоните. Вы должны использовать

Arrays.sort(dirs, new APTComp()); 

Пересмотренный код:

import java.util.Arrays; 
import java.util.Comparator; 

public class Main { 

    class APTComp implements Comparator<String> { 

     public int compare(String a, String b) { 
      String[] d1 = a.split("/"); 
      String[] d2 = b.split("/"); 
      int diff = d1.length - d2.length; 

      if (diff != 0) { 
      return diff; 
      } //{"/","/usr/","/usr/local/","/usr/local/bin/","/games/","/games/snake/","/homework/","/temp/downloads/"} 

      return a.compareTo(b); 
     } 
    } 


     public String[] sort(String[] dirs) { 
     Arrays.sort(dirs, new APTComp()); 
     return dirs; 
     } 

     public static void main(String[] args) { 
      Main main = new Main(); 
      String[] result = main.sort(new String[] {"/","/usr/","/usr/local/","/usr/local/bin/","/games/","/games/snake/","/homework/","/temp/downloads/"}); 
      for(int i=0; i<result.length; i++) { 
      System.out.println(i + ": " + result[i]); 
      } 
     } 
} 

Результат: 0:/ 1:/игры/ 2:/домашние задания/ 3:/USR/ 4:/игры/змея/ 5:/Temp/загрузки/ 6:/USR/местные/ 7:/USR/местные/бен/

См another example

+0

Привет. Я внес изменения, которые вы предложили. Однако он все еще говорит, что в коде существуют ошибки синтаксического анализа. – user2904796

+0

был добавлен пересмотренный код. –

+0

Привет. Поэтому я запустил его снова и сейчас, код просто сортируется по алфавиту, а не по глубине каталога. Глубина директории должна быть первым критерием, используемым для сортировки массива. Что-то не так с моим методом компаратора? – user2904796

0

Этот код работает, пожалуйста, проверьте

import java.util.Arrays; 
import java.util.Comparator; 

public class Dirsort { 

class APTComp implements Comparator<String> { 

    public int compare(String a, String b) { 
     String[] d1 = a.split("/"); 
     String[] d2 = b.split("/"); 
     int diff = d1.length - d2.length; 
     if (diff != 0) { 
      return diff; 
     } 
     return a.compareTo(b); 
    } 

    public String[] sort(String[] dirs) { 
     Arrays.sort(dirs); 
     return dirs; 
    } 
} 

public static void main (String[] args) { 
    String[] arr = new String[] {"/","/usr/","/usr/local/","/usr/local/bin/","/games/","/games/snake/","/homework/","/temp/downloads/"}; 
Dirsort ds = new Dirsort(); 
    Arrays.sort(arr, ds.new APTComp()); 
    for (String s : arr) { 
     System.out.println(s); 
    } 
} 
} 

ВЫВОД:
/
/игры/
/домашние задания/
/USR/
/Игры/змея/
/температуры/загрузок/
/usr/local/
/usr/local/bin/

+0

Здравствуйте. Да, код работает, но он не сортирует так, как должен. Сначала каталоги должны сортироваться по глубине, а затем, если есть две директории с одинаковой глубиной, их следует сортировать по алфавиту. – user2904796

+0

О, извините, я просто неправильно понял, теперь я редактировал код. Пожалуйста, проверьте –

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