我正在阅读.csv
文件,有点像excel中的电子表格。有一定数量的列,由文件确定,我使用.split(",")
方法将每行读入字符串数组。然后我把它放到一个数组列表中,这样它就可以保存所有的字符串数组而不给它一个特定的大小。但是,当我使用Collections.sort()
对数组列表进行排序时,程序会中断。问题是什么?这是我要排序的代码:
Collections.sort(stringList, new Comparator < String[] > () {
public int compare(String[] strings, String[] otherStrings) {
return -1 * (strings[sortNum].compareTo(otherStrings[sortNum]));
}
});
答案 0 :(得分:6)
两点:
compare
的结果乘以-1以反转比较。 Integer.MIN_VALUE * -1
仍为Integer.MIN_VALUE
。相反,颠倒比较本身的顺序类似的东西:
Collections.sort(stringList, new Comparator < String[] > () {
public int compare(String[] x1, String[] x2) {
if (x1.length > sortNum && x2.length > sortNum) {
return x2[sortNum].compareTo(x1[sortNum]);
}
if (x1.length > sortNum) {
return 1;
}
if (x2.length > sortNum) {
return -1;
}
return x2.length - x1.length;
}
});
或者,首先过滤您的列表,以确保确定所有行都有足够的列。
答案 1 :(得分:1)
嗯,字符串[sortNum]或otherStrings [sortNum]可能超出范围。您需要进行一些检查以防止这种情况发生。此外,字符串[sortNum]或otherStrings [sortNum]可以为null。我打赌你遇到了这两件事之一。调用堆栈表示什么?
答案 2 :(得分:1)
尝试使用此
首先使用构造函数的类比较器:
public class MyStringArrayComparator implements Comparator<String[]>{
Integer sortNum;
public MyStringComparator(Integer index) {
sortNum = index;
}
@Override
public int compare(String[] strings, String[] otherStrings) {
return -1*(strings[sortNum].compareTo(otherStrings[sortNum]));
}
}
并在您的代码中
Collections.sort(stringList,new MyStringArrayComparator<String[]>(index));
希望对你有用
答案 3 :(得分:1)
在有人需要对多列进行排序时共享代码。
public final class ArrayComparatorWithIndex<T extends Comparable<T>> implements Comparator<T[]>
{
private final int[] indexToSort;
public ArrayComparatorWithIndex(int[] indexToSort)
{
if(indexToSort == null || indexToSort.length == 0){
throw new IllegalArgumentException("Index to use for sorting cannot be null or empty.");
}
this.indexToSort = indexToSort;
}
@Override
public int compare(T[] str, T[] otherStr)
{
int result= 0;
for (int index : indexToSort)
{
result= str[index].compareTo(otherStr[index]);
if (result != 0){
break;
}
}
return result;
}
}
//Example how to use it:
int[] indexForSorting= new int[] { 1, 3 };
Collections.sort(stringList, new ArrayComparatorWithIndex<String>(indexForSorting));
答案 4 :(得分:0)
我怀疑你在引用'sortNum'变量时可能有一个闭包问题。请参阅Jon Skeet's closure article获取一些指导,即使它处理C#中的闭包,它仍然应该是相关的。即使你没有这个问题,这也是一个很好的阅读。 :)
答案 5 :(得分:0)
您可以为空“单元格”提供默认值:
public int compare(String[] strings, String[] otherStrings) {
String one, other;
one = other = ""; // default value
if (sortNum<strings.length && strings[sortNum] != null) {
one = strings[sortNum];
}
if (sortNum<otherStrings.length && otherStrings[sortNum] != null) {
other = otherStrings[sortNum];
}
return -1 * (one.compareTo(other));
}