Вы можете создать специальный тип AlphaNumericList
, обернуть список массивов или любые другие коллекции, которые вы хотите использовать внутри, предоставив ему приятный интерфейс publi c для работы, или для простейшего случая, если вы хотите придерживаться ArrayList<String>
, просто используйте Comparator
для sort(..)
:
package de.scrum_master.stackoverflow.q60482676;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static java.lang.Integer.parseInt;
public class Collect {
public static void main(String[] args) {
List<String> alphaNumericList = Arrays.asList(
"Demo.23", "Demo.1000", "Demo.12", "Demo.12",
"Test.01", "Test.02", "Test.100", "Test.99"
);
Collections.sort(
alphaNumericList,
(o1, o2) ->
((Integer) parseInt(o1.split("[.]")[1])).compareTo(parseInt(o2.split("[.]")[1]))
);
System.out.println("Output " + alphaNumericList);
}
}
Это приведет к следующему журналу консоли:
Output [Test.01, Test.02, Demo.12, Demo.12, Demo.23, Test.99, Test.100, Demo.1000]
Пожалуйста, дайте мне знать если вы не понимаете лямбда-синтаксис. Вместо этого вы также можете использовать анонимный класс, как в предыдущих версиях Java.
Обновление 1: Если вы хотите реорганизовать однострочную лямбду для лучшей читаемости , может быть, вы предпочитаете это:
Collections.sort(
alphaNumericList,
(text1, text2) -> {
Integer number1 = parseInt(text1.split("[.]")[1]);
int number2 = parseInt(text2.split("[.]")[1]);
return number1.compareTo(number2);
}
);
Обновление 2: Если более одной точки "." символ может появляться в ваших строках, вам нужно получить подстроку Numberri c другим способом через совпадение с регулярным выражением, все еще не сложно:
Collections.sort(
alphaNumericList,
(text1, text2) -> {
Integer number1 = parseInt(text1.replaceFirst(".*[.]", ""));
int number2 = parseInt(text2.replaceFirst(".*[.]", ""));
return number1.compareTo(number2);
}
);
Обновление 3: Я просто заметил, что по какой-то странной причине вы помещаете отсортированный список в другой список с помощью Arrays.asList(alphaNumericList)
при печати. Я заменил это на alphaNumericList
в приведенном выше коде, а также обновил журнал консоли. До вывода было похоже на [[foo, bar, zot]]
, то есть вложенный список с одним элементом.