Сортировать половину String ArrayList на основе подстроки каждой строки - PullRequest
0 голосов
/ 24 октября 2019

У меня есть String ArrayList размеров, например

[12, 10L, 10, 10R, 10S, 10L]

Вывод должен быть

[10S, 10R, 10L, 10, 12]

Таким образом, в основном размеры должны сначала сортироваться по номеру - (1,2,3,4,5 ... и т. Д.), А затем по буквам.

Мне удалось получить числа для сортировки, поэтому мой текущий вывод для указанного выше ввода

10L, 10, 10R, 10S, 10L, 12

, если буква отсутствует, то этосамое большое (см. вывод выше - 10 - после 10L - 10S <10R <10L <10 <12.) </p>

Как мне кодировать компаратор, который позволяет мне это делать?

Рассмотримвходной массив, размеры. Этот массив содержит размеры продуктов в формате AB, где:

A - обязательное целое число B - необязательный символ в [S, R, L] Размеры сначала должны быть упорядочены от наименьшего к наибольшему по A, а затемпо B в порядке S

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Попробуйте, если это работает для ваших тестовых случаев. Мы всегда можем уточнить это при необходимости. (Добавлен вспомогательный метод)

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);
0 голосов
/ 24 октября 2019

Я предполагаю, что finalList список содержит данные сортировки.

10L, 10, 10R, 10S, 10L, 12

Используйте регулярное выражение для сопоставления целого числа, объедините список alphanumerics и numbers.

В вашем отсортированном списке запустите этот

List<String> numberList= new ArrayList<String>(); // store number list
List<String> sizeList= new ArrayList<String>(); // store alphanumerics
for(String value: finalList){

  if(!value.matches("[0-9]+")){  // if contains characters
     sizeList.add(value);
   }
   else{
        numberList.add(value);
  }
}

sizeList.addAll(numberList); 

sizeList имеет то, что вам нужно

...