Java 用于排序的“可比”中的“重叠比较器”

Java 用于排序的“可比”中的“重叠比较器”,java,sorting,comparable,Java,Sorting,Comparable,导言 我试图为字符串数组创建一个自定义排序方法,但由于某些原因,我的代码无法工作。我正在编写的方法将接受这样的输入 {"/", "/games/", "/homework/", "/usr/", "/games/snake/", "/temp/downloads/", "/usr/local/", "/usr/local/bin/"} 我想分类如下: 通过目录的数量,即“/”将首先出现,然后是“/游戏/”,等等 如果是平局,则应根据最后一个目录按字母顺序排序 我的代码 impor

导言

我试图为字符串数组创建一个自定义排序方法,但由于某些原因,我的代码无法工作。我正在编写的方法将接受这样的输入

{"/",
 "/games/",
 "/homework/",
 "/usr/",
 "/games/snake/",
 "/temp/downloads/",
 "/usr/local/",
 "/usr/local/bin/"}
我想分类如下:

  • 通过目录的数量,即“/”将首先出现,然后是“/游戏/”,等等
  • 如果是平局,则应根据最后一个目录按字母顺序排序
  • 我的代码

    import java.util.*;
    
    public class Dirsort {
        public String[] sort(String[] dirs) {
            ArrayList<Sort> mySort = new ArrayList<Sort>();
    
            for (String d: dirs){
                String l = d.split("/")[-1];
                int di = d.length();
                mySort.add(new Sort(di,l,d));
            }
            Collections.sort(mySort);
            String [] ans = new String [mySort.size()];
            int count = 0;
            for (Sort s: mySort){
                ans[count] = s.toString();
                count++;
            }
            return ans;
        }
        class Sort implements Comparable<Sort>{
            private int d;
            private String last;
            private String dir;
    
            public Sort(int myD, String myLast, String myDir){
                d = myD;
                last = myLast;
                dir = myDir;
            }
    
            public String toString(){
                return dir;
            }
    
            @Override
            public int compareTo(Sort arg0) {
                // TODO Auto-generated method stub
                if (this.d == arg0.d){
                    return this.last.compareTo(arg0.last);
                }
                return this.d-arg0.d;
            }   
        }
    }
    
    import java.util.*;
    公共类Dirsort{
    公共字符串[]排序(字符串[]目录){
    ArrayList mySort=新的ArrayList();
    for(字符串d:dirs){
    字符串l=d.split(“/”[-1];
    int di=d.长度();
    add(新排序(di,l,d));
    }
    Collections.sort(mySort);
    String[]ans=新字符串[mySort.size()];
    整数计数=0;
    for(排序s:mySort){
    ans[count]=s.toString();
    计数++;
    }
    返回ans;
    }
    类排序实现了可比较的{
    私人int d;
    私有字符串最后;
    私有字符串目录;
    公共排序(int-myD、String-myLast、String-myDir){
    d=myD;
    last=myLast;
    dir=myDir;
    }
    公共字符串toString(){
    返回目录;
    }
    @凌驾
    公共整数比较(排序arg0){
    //TODO自动生成的方法存根
    if(this.d==arg0.d){
    返回this.last.compareTo(arg0.last);
    }
    返回此.d-arg0.d;
    }   
    }
    }
    
    问题

    当我测试我的代码时,我得到了以下错误,我不知道为什么

    运行时异常:java.lang.ArrayIndexOutOfBoundsException: -1java.lang.ArrayIndexOutOfBoundsException:-1在Dirsort.sort处(Dirsort.java:6)在Tester$1处运行(Tester.java:48)[“/”, “/usr/”、“/usr/local/”、“/usr/local/bin/”、“/games/”、“/games/snake/”, “/homography/”,“/temp/downloads/”]


    在Java中,不能使用
    -1
    索引数组。在Python中,您可能已经获得了列表的最后一个元素。欢迎使用Java,在Java中,您需要先存储数组,然后才能将其长度用作自身的索引

    String[] dSplit = d.split("/");
    String l = dSplit [dSplit.length-1];
    

    解决问题的最简单和更可读的实现是使用
    比较器
    而不是
    Comparable
    Comparable
    更适合您自己的类

    import java.util.*;
    
    public class Sort {
        public static void main(String[] args) {
            String[] testArray = {
                "/",
                "/games/",
                "/homework/",
                "/usr/",
                "/games/snake/",
                "/temp/downloads/",
                "/usr/local/",
                "/usr/local/bin/"
            };
    
            Comparator<String> pathComparator = new PathComparator();
            Arrays.sort(testArray, pathComparator);
    
            System.out.println(Arrays.toString(testArray));
        }
    
        static class PathComparator implements Comparator<String> {
    
            public int compare(String path1, String path2) {
                String[] dirs1 = path1.split("/");
                String[] dirs2 = path2.split("/");
    
                if (dirs1.length < dirs2.length) {
                    return -1;
                }
                else if (dirs1.length > dirs2.length) {
                    return 1;
                }
                else {
                    String lastDir1 = dirs1[dirs1.length - 1];
                    String lastDir2 = dirs2[dirs2.length - 1];
    
                    return lastDir1.compareTo(lastDir2);
                }
            }
        }
    }
    
    import java.util.*;
    公共类排序{
    公共静态void main(字符串[]args){
    字符串[]testArray={
    "/",
    “/游戏/”,
    “/家庭作业/”,
    “/usr/”,
    “/games/snake/”,
    “/temp/downloads/”,
    “/usr/local/”,
    “/usr/local/bin/”
    };
    Comparator pathComparator=新的pathComparator();
    排序(testArray、pathComparator);
    System.out.println(Arrays.toString(testArray));
    }
    静态类PathComparator实现Comparator{
    公共整数比较(字符串路径1、字符串路径2){
    字符串[]dirs1=path1.split(“/”);
    字符串[]dirs2=path2.split(“/”);
    if(dirs1.lengthdirs2.length){
    返回1;
    }
    否则{
    字符串lastDir1=dirs1[dirs1.length-1];
    字符串lastDir2=dirs2[dirs2.length-1];
    返回lastDir1.compareTo(lastDir2);
    }
    }
    }
    }
    

    还请注意,为变量使用描述性名称可以使代码更具可读性。当代码包含名为
    d
    l
    arg0
    等的变量时,它将变得不可读。例如,
    l
    可以表示
    length
    last
    list
    。再过两周,你就不会记得它的意思了。

    String l=d.split(“/”[-1]索引从
    0
    length-1
    。使用
    -1
    作为索引在Java中不起作用。。。我打赌您希望它返回数组的最后一个元素,但它没有;)学习Java的Perl/Python程序员?Java中没有[-1]方法。您需要改用[x.length-1]。顺便说一句:我正在调整你的第一篇帖子,对于以后的问题,我建议你在出现异常的地方标出行(行号并不总是很容易找到)。