Создание алгоритма, который может сортировать строковые / целочисленные массивы - PullRequest
3 голосов
/ 11 апреля 2011

Я пытаюсь выяснить, как создать функцию сортировки, которая будет сортировать массив в порядке убывания.

public void dsort(String field) throws DataSetException {
    int front = 0;
    int findex = -1;

    String[] tosort = new String[50];
    for (int i = 0; i < filedata[0].length; i++) {
        if (field.equalsIgnoreCase(filedata[0][i])) {
            findex = i;
        }
    }
    if (findex == -1) {
        throw new DataSetException();
    } else {
        for (int k = 0; k < getNumRecords(); k++) {
            if (filedata[k][findex] != null) {
                tosort[front] = filedata[k][findex];
                front++;
            }
        }
        Comparator comparator = Collections.reverseOrder();
        Arrays.sort(tosort, comparator);
        System.out.println(Arrays.asList(tosort));
    }
}

То, что это делает, создает новый массив, беря элементы из массива массивов, что я и хочу. Тем не менее, мой результат примерно 32, 3, 25, 20, 2, 1000, 1 и т. Д. Эти "целые числа" считаются строками, и предполагается, что эта функция сортировки также способна сортировать слова как строки. Я думаю, что я должен пытаться использовать сопоставимые, но я не уверен, как реализовать это в этой ситуации.

Ответы [ 2 ]

2 голосов
/ 11 апреля 2011

Если все на самом деле является числом, то вы не хотите сохранять их как строки, сохранять их как числа и затем использовать числовую сортировку.

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

0 голосов
/ 11 апреля 2011

Использование Google Guava :

List<String> sortedList = Ordering.natural().reverse().onResultOf(new Function<String, Integer>() {
  @Override public Integer apply(String input) {
    return Integer.valueOf(input); // assumes input is always valid
  }
}).immutableSortedCopy(Iterables.concat(listOfLists));

Или что-то в этом роде.Iterables.concat возьмет итерируемую итерацию и превратит ее в одну итерацию для вас.Возможно, вам понадобится превратить ваш массив массивов в список списков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...