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