覆盖compareTo in Comparable进行排序

时间:2014-02-21 20:11:16

标签: java sorting comparable

简介

我正在尝试为字符串数组创建自定义排序方法,但我的代码由于某种原因无法正常工作。我正在编写的方法将采用这样的输入

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

我想按如下方式排序:

  1. 按目录数量,即“/”首先出现“/ games /”等......
  2. 如果是平局,则应根据最后一个目录按字母顺序排序。
  3. 我的代码

    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;
            }   
        }
    }
    

    问题

    我在测试代码时遇到以下错误,但我无法弄清楚原因。

      

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您问题的最简单且更易读的实现是使用Comparator而不是ComparableComparable更适合您自己的课程。

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);
            }
        }
    }
}

另请注意,使用变量的描述性名称可使代码更具可读性。当您的代码包含名为dlarg0等的变量时,它将变得不可读。例如,l可以表示lengthlastlist。在2周内你将不记得它的意思。