Попробуйте, если это работает для ваших тестовых случаев. Мы всегда можем уточнить это при необходимости. (Добавлен вспомогательный метод)
List<String> list = new ArrayList<>(Arrays.asList("12","10L","10","10R","10S","10L","14L","14","8","12S"));
List<String> orderArray = new ArrayList<>(Arrays.asList("S", "R", "L"));
List<String> sortedList = list.stream()
.sorted(Comparator.comparing(str -> Integer.parseInt(((String)str).replaceAll("[A-Z]*","")))
.thenComparing(str -> getAnInt(orderArray, (String) str)))
.distinct()
.collect(Collectors.toList());
System.out.println(sortedList);
private int getAnInt(List<String> orderArray, String str) {
int i = orderArray.indexOf(str.substring(str.length() - 1));
if (i == -1) return Integer.MAX_VALUE;
return i;
}
Вывод: [8, 10S, 10R, 10L, 10, 12S, 12, 14L, 14]
, если вы не хотите использоватьпотоки:
List<String> list = new ArrayList<>(Arrays.asList("12","10L","10","10R","10S","10L","14L","14","8","12S"));
List<String> orderArray = new ArrayList<>(Arrays.asList("S", "R", "L"));
list.sort(new Comparator<String>() {
@Override
public int compare(String lhs, String rhs) {
int lInt = Integer.parseInt(lhs.replaceAll("[A-Z]*", ""));
int rInt = Integer.parseInt(rhs.replaceAll("[A-Z]*", ""));
if (lInt != rInt) {
return lInt - rInt;
} else {
return getAnInt(orderArray, lhs) - getAnInt(orderArray, rhs);
}
}
});
System.out.println(list);