Как я могу отсортировать этот ArrayList способ, которым я хочу?

Я понимаю, что этот вопрос довольно старый (2011 г.), но просто для того, чтобы опубликовать актуальный ответ на тот случай, если кто-то (например, я) ищет эту проблему и наткнется на этот вопрос:

С iOS 9 Apple значительно улучшилась UITableView. Чтобы убедиться, что фокус не будет потерян при перезагрузке таблицы, просто сделайте это:

tableView.remembersLastFocusedIndexPath = Yes;

, и он будет «магически работать».

Еще лучше, внедрите

- (NSIndexPath *)indexPathForPreferredFocusedViewInTableView:(UITableView *)tableView

в UITableViewDelegate, чтобы таблица знала, какую строку вы хотите выбрать, когда она отображается в первый раз.

До iOS 9 я обычно просто писал свой собственный метод reloadData, который получает текущую выбранную строку, перезагружает таблицу и затем выбирает ее снова. Либо в UITableViewController, либо, если мне нужно это для работы с таблицей, в которой я не могу предотвратить прямой вызов кода reloadData, я подклассифицировал UITableView и переопределил reloadData (эй, делегирование является предпочтительным способом, но иногда вы просто приходится создавать подклассы и переопределять даже в iOS).

36
задан Erick Robertson 13 November 2012 в 19:03
поделиться

11 ответов

Вы можете написать собственный компаратор:

Collections.sort(list, new Comparator<String>() {
    public int compare(String a, String b) {
        return Integer.signum(fixString(a) - fixString(b));
    }
    private int fixString(String in) {
        return Integer.parseInt(in.substring(0, in.indexOf('_')));
    }
});
70
ответ дан 27 November 2019 в 05:29
поделиться

Когда вы сортируете данные этого типа в виде строки, они сравнивают сами символы, включая цифры. Например, вся строка, начинающаяся с «1», в конечном итоге окажется вместе. Таким образом, порядок выглядит примерно так ...

1 10 100 2 20 200

Ни в какой момент сортировка не «понимает», что вы присваиваете значение подмножествам строки, таким как числа переменной длины в начале строки. При сортировке чисел в виде строк может помочь заполнение слева нулями столько, сколько требуется для покрытия наибольшего числа, но на самом деле это не решает проблему, когда вы не контролируете данные, как в вашем примере. В этом случае сортировка будет ...

001 002 010 020 100 200

8
ответ дан 27 November 2019 в 05:29
поделиться

Он сортируется как текст (по алфавиту), а не как числа. Чтобы обойти это, вы можете реализовать собственный компаратор, как предложено в ответе nsayer.

6
ответ дан 27 November 2019 в 05:29
поделиться

Выполняется лексикографическое сравнение. Он сравнивает первый символ в каждой строке, сортируя их. Затем он сравнивает вторую строку из строк с тем же первым символом. Когда он сравнивает символ «_» с числом, он имеет большее значение, чем любой отдельный числовой символ, точно так же, как 8> 7 и a> 9. Помните, что он выполняет сравнение символов, а не числовое сравнение.

способы реализации вашей собственной настраиваемой маршрутизации сортировки, которые могут быть лучше, чем переименование ваших имен сценариев.

Если переименование ваших имен сценариев является вариантом, это может позволить использовать другие инструменты сценариев. Один формат может быть

01_create_table.sql
02_create_index.sql
11_assign_privileges.sql

. Если первые две цифры будут соответствовать двум символам, лексикографическое сравнение будет работать.

3
ответ дан 27 November 2019 в 05:29
поделиться

В документации метода Collections.sort () говорится:

Сортирует указанный список в в порядке возрастания, согласно естественный порядок его элементов.

Что означает для строк, что вы собираетесь получить список в алфавитном порядке. Строка 11_assign_privileges.sql идет перед строкой 1_create_table.sql, а 12_07_insert_static_data.sql идет перед 1_create_table.sql и т. Д. Таким образом, программа работает должным образом.

2
ответ дан 27 November 2019 в 05:29
поделиться

Поскольку строки отсортированы в алфавитном порядке, а символ подчеркивания стоит после символов для чисел. Вы должны предоставить компаратор, реализующий «Естественный порядок» для достижения желаемого результата.

0
ответ дан 27 November 2019 в 05:29
поделиться

Алгоритм сравнения строк сравнивает каждый символ за раз. 1 сортируется до 2 . Не имеет значения, что за ним следует 1 или 2 .

Таким образом, 100 будет отсортировано перед 2 . Если вам не нужно такое поведение, вам понадобится алгоритм сравнения, который обрабатывает этот случай.

0
ответ дан 27 November 2019 в 05:29
поделиться

Как утверждали другие, по умолчанию элементы будут отсортированы в алфавитном порядке. Решение состоит в том, чтобы определить конкретный класс java.util.Comparator и передать его в качестве второго аргумента методу сортировки. Вашему компаратору нужно будет выделить ведущие целые числа из строк и сравнить их.

0
ответ дан 27 November 2019 в 05:29
поделиться

Для произвольной сортировки Collection.sort () вы можете использовать

Collections.sort(List list, Comparator c)  

Затем просто реализуйте Comparator, который разбивает строку и сортирует сначала по числу, а затем по остальным, или как вы хотите его отсортировать.

0
ответ дан 27 November 2019 в 05:29
поделиться

Все уже указали, что объяснение заключается в том, что ваши строки сортируются как строки, и ряд уже обратил ваше внимание на сравнение строк в естественном порядке . Я просто добавлю, что это отличное упражнение - написать этот компаратор самостоятельно и прекрасная возможность попрактиковаться в разработке, основанной на тестировании. Я использовал его для демонстрации TDD в Code Camp; слайды и код здесь .

0
ответ дан 27 November 2019 в 05:29
поделиться

Как указано выше, вам нужна реализация Comparator, реализующая естественную сортировку. Джефф Этвуд некоторое время назад написал отличный пост о естественной сортировке - его стоит прочитать.

Если вы ищете реализацию Java, я считаю, что это будет полезно: http://www.davekoelle.com/alphanum.html

0
ответ дан 27 November 2019 в 05:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: