简介
我正在尝试为字符串数组创建自定义排序方法,但我的代码由于某种原因无法正常工作。我正在编写的方法将采用这样的输入
{"/",
"/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;
}
}
}
问题
我在测试代码时遇到以下错误,但我无法弄清楚原因。
运行时异常: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 /”]
答案 0 :(得分:0)
您无法在Java中使用-1
索引数组。在Python中,您可能已经获得了列表的最后一个元素。欢迎使用Java,您需要先存储数组,然后才能将其长度用作自身的索引。
String[] dSplit = d.split("/");
String l = dSplit [dSplit.length-1];
答案 1 :(得分:0)
您问题的最简单且更易读的实现是使用Comparator
而不是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);
}
}
}
}
另请注意,使用变量的描述性名称可使代码更具可读性。当您的代码包含名为d
,l
,arg0
等的变量时,它将变得不可读。例如,l
可以表示length
或last
或list
。在2周内你将不记得它的意思。