Закрытое правило сортировки в потоке Java - PullRequest
0 голосов
/ 12 ноября 2018

Эй, если у кого-то есть идея, я был бы очень благодарен.Я нахожусь в потоке Java, и я хотел бы отсортировать мой список, который я буду возвращать.Мне нужно отсортировать список через TradPrefis (MyObject :: getTradPrefix).Но это было бы слишком просто.Потому что я хочу отсортировать по номеру в конце TradPrefix exampleTradPrefix_ [NUMBER TO SORT]

Пример: hello_1 test_2 ... still_there_22

Вот фрагмент кода, который вы можете представить себе проще.

public LinkedHashSet<WsQuestion> get(String quizId, String companyId) {
    LinkedHashSet<QuizQuestionWithQuestion> toReturn = quizQuestionRepository.findAllQuizQuestionWithQuestionByQuizId(quizId);
    return (toReturn.stream()
            .map(this::createWsQuestion)
            .sorted(comparing(WsQuestion::getTradPrefix.toString().length()))
            .collect(Collectors.toCollection(LinkedHashSet::new)));
}

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018

Вы можете сделать маленький Comparator, как это:

  private static final Comparator<String> questionComparator = Comparator.comparingInt(s -> {
    String[] pieces = s.split("_");
    return Integer.parseInt(pieces[pieces.length-1]);
  });

Тогда используйте его в своем sorted().

Наличие отдельного компаратора сделает ваш код более читабельным, поскольку вы будете разделять задачи.

return toReturn.stream()
            .map(this::createWsQuestion)
            .sorted(questionComparator)
            .collect(Collectors.toCollection(LinkedHashSet::new));
0 голосов
/ 12 ноября 2018

Если бы я поместил метод в класс WsQuestion, давайте назовем его порядком сортировки:

public int getSortOrder() {
  return Integer.valueOf(tradPrefix.substring(tradPrefix.lastIndexOf("_") + 1));
}

Требуется синтаксический анализ Integer, поскольку сравнение строк даст «11» <«2» </em> (спасибо Хольгер за указание на это).lastIndexOf() гарантирует, что в tradPrefix разрешено любое количество подчеркиваний, если есть хотя бы один.

Затем просто создайте компаратор, используя Comparator.comparingInt()

public LinkedHashSet<WsQuestion> get(String quizId, String companyId) {
  LinkedHashSet<QuizQuestionWithQuestion> toReturn = quizQuestionRepository.findAllQuizQuestionWithQuestionByQuizId(quizId);
  return (toReturn.stream()
      .map(this::createWsQuestion)
      .sorted(comparingInt(WsQuestion::getSortOrder))
      .collect(Collectors.toCollection(LinkedHashSet::new)));
}
0 голосов
/ 12 ноября 2018

Одним из способов будет просто разделить getTradPrefix().toString() на _ и проанализировать крайнее правое значение как int и использовать его для сортировки Stream:

public LinkedHashSet<WsQuestion> get(String quizId, String companyId) {
    LinkedHashSet<QuizQuestionWithQuestion> toReturn = quizQuestionRepository.findAllQuizQuestionWithQuestionByQuizId(quizId);
    return toReturn.stream()
        .map(this::createWsQuestion)
        .sorted(Comparator.comparingInt(question -> {
            String[] args = question.getTradPrefix().toString().split("_");
            return Integer.parseInt(args[args.length - 1]);
        }))
        .collect(Collectors.toCollection(LinkedHashSet::new));
}
...