【问题标题】:Java Embedded Comparator ClassJava 嵌入式比较器类
【发布时间】:2014-03-08 18:11:18
【问题描述】:

我在编译我编写的一些代码时遇到了问题。该代码旨在对目录数组进行排序,然后返回排序后的数组。传入程序的数组如下所示:{"/","/usr/","/usr/local/","/usr/local/bin/","/games/","/games/snake/","/homework/","/temp/downloads/"}

对此的排序答案是:

{ "/", "/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() 调用是否使用了我的修改比较方法?

非常感谢, 朱奈德

【问题讨论】:

    标签: java sorting comparator


    【解决方案1】:

    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:/临时/下载/ 6:/usr/本地/ 7:/usr/local/bin/

    another example

    【讨论】:

    • 嗨。我做了你建议的改变。但是它仍然说代码中存在解析错误。
    • 嗨。所以我再次运行它,目前,代码只是按字母顺序排序,而不是目录的深度。目录的深度应该是用于对数组进行排序的第一个标准。我的比较器方法有问题吗?
    • 已提供修改后的代码和输出。
    【解决方案2】:

    此代码有效,请检查

    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/
    /游戏/蛇/
    /temp/下载/
    /usr/local/
    /usr/local/bin/

    【讨论】:

    • 你好。是的,代码正在运行,但它没有按照应有的方式进行排序。目录应先按深度排序,如果有两个相同深度的目录,则按字母顺序排序。
    • 哦,对不起,我刚才理解错了,现在我编辑了代码。请检查
    【解决方案3】:

    默认 Arrays.sort() 方法使用自然顺序进行排序。由于您的情况下的数组是字符串,默认情况下它将根据字符串的字母顺序进行排序。

    要获得您想要的结果,您必须将自定义比较器实现的实例传递给 Arrays.sort()。

    APTComp 类中的public String[] sort(String[] dirs) 方法替换为:

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

    【讨论】:

    • 嗨。所以我再次运行它,目前,代码只是按字母顺序排序,而不是目录的深度。目录的深度应该是用于对数组进行排序的第一个标准。我的比较器方法有问题吗?
    • 您的比较器方法实现看起来不错。上面的方法给了我正确的结果。它给出的结果数组是 / /games/ /homework/ /usr/ /games/snake/ /temp/downloads/ /usr/local/ /usr/local/bin/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 2010-09-11
    • 2015-10-11
    • 2021-09-06
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多