У меня есть List<String>
единиц и глав для базовой карточной игры. Я хотел бы упорядочить их от меньшего к большему (например, глава 1, модуль 1, глава 2 и т. д.)
Используя этот код:
String UnitsChaptersString = Utils.GetReviewUnitsChapters().replaceAll(" ", "_");
List<String> UnitsChaptersList = Arrays.asList(UnitsChaptersString.split(","));
for (int i = 0; i < UnitsChaptersList.size(); i++) {
// Order and add to the RecyclerView here...
}
Я получаю и перебираю список модулей и глав.
Пример значения String
, возвращаемого Utils.GetReviewUnitsChapters()...
, таков:
Chapter_3,Unit_2,Chapter_1
Со строкой выше конечный результат должен быть: Chapter_1,Chapter_3,Unit_2.
Для ясности, Unit_2
больше как Chapter_1
, так и Chapter_3
, но Unit_1
больше только Chapter_1
.
Важное примечание: юниты «удерживают» главы! Главы являются дочерней компанией Units.
Визуальное дерево:
Раздел 1:
Глава 1
Глава 2
И т. д...
Модуль 2:
Глава 5
Глава 6
И так далее.
У меня был тот же вопрос для Swift (Устранить ошибки массива .sorted Swift 5). Обратите внимание, что в Swift есть хорошая функция .sorted()
. Может ли быть один для Java?
StackOverflow пытался отправить меня по этой ссылке, но это не был ответ на мой вопрос.
Я также рассматривал вариант List.sort(...)
, но столкнулся со стеной Comparators
и super Strings
, поэтому не смог реализовать это самостоятельно.
Используя один из предложенных методов, я использовал этот код:
List<String> TestList = Arrays.asList("Chapter_1", "Unit_3", "Chapter_42", "Chapter_2");
Collections.sort(TestList);
for (int i = 0; i < TestList.size(); i++) {
Log.i("SortedList", TestList.get(i));
}
И получил это:
I/SortedList: Chapter_1
I/SortedList: Chapter_2
I/SortedList: Chapter_42
I/SortedList: Unit_3
Unit_3
должно быть после Chapter_2
, но перед Chapter_42
.
Другими словами, вывод должен быть:
I/SortedList: Chapter_1
I/SortedList: Chapter_2
I/SortedList: Unit_3
I/SortedList: Chapter_42
Спасибо!
@Slaw, нет, мои «главы» не состоят из юнитов. И, поскольку мои данные на самом деле не нуждаются в модели, я не хочу идти по этому пути.
Если вы хотите остаться со списком, эта ссылка может быть весьма полезной. В противном случае я бы пошел с подходом Slaw.
@vincere Ну, судя по вашему редактированию, я в основном просто понял это неправильно. Блок состоит из глав. И, учитывая вашу древовидную структуру, я по-прежнему считаю, что моделирование ваших данных с помощью классов — правильный подход. Позже, если вам действительно нужен плоский список, вы можете добавить эту функциональность (взять дерево и сгладить его; если главы расположены по порядку и единицы каждой главы расположены по порядку, то плоский список будет в порядке). Несмотря ни на что, нужно как-то зафиксировать принадлежность главы к юниту или, может быть, дать всему последовательные идентификаторы (в правильном порядке).
Лучший способ решить эту проблему, вероятно, состоит не в том, чтобы хранить эти данные в виде строк, а в виде фактической структуры данных.
Если вы застряли со строками, используйте сортировку с пользовательским компаратором, который решает, что будет первым на основе ваших критериев (для чего потребуется разбить эту строку на число и тип, а затем сравнить сначала число, а затем тип).
Спасибо! Это был мой последний вариант, и, думаю, я приступлю к работе.
Похоже, что глава состоит из юнитов, причем юниты не уникальны для разных глав. Я бы предположил, что плоский список не является правильным способом моделирования этих данных. И при этом не обязательно полагаться напрямую на
String
. Возможно, вам следует создать собственные классы с этим (например, классChapter
, у которого есть списокUnit
).