对String []数组的数组列表进行排序

时间:2011-09-06 16:02:37

标签: java sorting arraylist comparator

我正在阅读.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]));
    }
});

6 个答案:

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