Сортировка массива Список строковых [] массивов - PullRequest
5 голосов
/ 06 сентября 2011

Я читаю в .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 ]

6 голосов
/ 06 сентября 2011

Два очка:

  • Не умножьте результат 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 голос
/ 22 ноября 2014

Совместное использование кода на случай, если кому-то потребуется выполнить сортировку по нескольким столбцам.

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));
1 голос
/ 06 сентября 2011

Попробуйте использовать это

Сначала ваш классный компаратор с конструктором:

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));

Надеюсь, что это работает для вас

1 голос
/ 06 сентября 2011

Ну, либо strings [sortNum] или otherStrings [sortNum] могут быть вне границВы должны сделать некоторые проверки, чтобы предотвратить это.Кроме того, строки [sortNum] или otherStrings [sortNum] могут быть нулевыми.Могу поспорить, что вы столкнулись с одной из этих двух вещей.Что означает стек вызовов?

0 голосов
/ 06 сентября 2011

вы можете указать значения по умолчанию для пустых «ячеек»:

            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));
            }
0 голосов
/ 06 сентября 2011

Я подозреваю, что у вас может быть проблема с закрытием в связи с переменной sortNum.См. статью о закрытии Jon Skeet для получения некоторых указаний, даже если она имеет дело с замыканиями в C #, она все равно должна быть актуальной.Даже если у вас нет этой проблемы, это хорошее чтение.:)

...