我得到的比较方法违反了这个compareTo方法的一般合约异常,但是我无法追踪导致问题的原因。我试图以特定方式按其扩展名对文件进行排序。请注意,对于所有手机都没有这种情况,只有那些我无法访问的手机才会让它更难以测试。
public int compareTo(NzbFile another)
{
if (this.getFileName() != null && another.getFileName() != null)
{
if (this.getFileName().toLowerCase().endsWith(".nfo"))
return -1000;
else if (another.getFileName().toLowerCase().endsWith(".nfo"))
return 1000;
else if (this.getFileName().toLowerCase().endsWith(".sfv"))
return -999;
else if (another.getFileName().toLowerCase().endsWith(".sfv"))
return 1001;
else if (this.getFileName().toLowerCase().endsWith(".srr"))
return -998;
else if (another.getFileName().toLowerCase().endsWith(".srr"))
return 1002;
else if (this.getFileName().toLowerCase().endsWith(".nzb"))
return -997;
else if (another.getFileName().toLowerCase().endsWith(".nzb"))
return 1003;
else if (this.getFileName().toLowerCase().endsWith(".srt"))
return -996;
else if (another.getFileName().toLowerCase().endsWith(".srt"))
return 1004;
else
return this.getFileName().compareTo(another.getFileName());
}
else if (this.getFileName() != null && another.getFileName() == null)
{
return -995;
}
else if (this.getFileName() == null && another.getFileName() != null)
{
return 1005;
}
else
{
return this.getSubject().compareTo(another.getSubject());
}
}
答案 0 :(得分:5)
如果您的文件名相同,并且两者都是在.nfo
结束,然后这将返回它们不相等。我认为他们的意思是平等的。
我强烈怀疑有更好的方法可以做到这一点。我会用Guava作为我的例子,但这并不是绝对必要的。
static final List<String> EXTENSIONS = ImmutableList.of("nfo", "sfv", "srr", "nzb", "srt");
final Ordering<String> fileNameOrdering = new Ordering<String>() {
public int compare(String a, String b) {
String extA = Files.getFileExtension(a);
String extB = Files.getFileExtension(b);
int extAIndex = EXTENSIONS.indexOf(extA);
int extBIndex = EXTENSIONS.indexOf(extB);
if ((extAIndex >= 0) == (extBIndex >= 0)) { // if they are both known extensions or both unknown
return extAIndex - extBIndex;
} else if (extAIndex < 0) { // a is unknown, b is known
return -1;
} else if (extBIndex < 0) { // b is unknown, a is known
return 1;
}
return a.compareTo(b);
}
}.nullsLast();
return new Ordering<NzbFile>() {
public int compare(NzbFile a, NzbFile b) {
return ComparisonChain.start()
.compare(a.getFileName(), b.getFileName(), fileNameOrdering)
.compare(a.getSubject(), b.getSubject())
.result();
}
};
答案 1 :(得分:2)
实施者必须确保sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) for all x and y.
如果比较具有相同扩展名的两个文件,似乎不会发生这种情况。比较说a.nfo
和b.nfo
返回-1000,两种方式都是圆的。