Эффективный способ обработки сингулярного/множественного слова на основе некоторого размера коллекции

В моих рабочих проектах много примеров, где мне нужно отображать размер какой-либо коллекции в предложении. Например, если размер коллекции равен 5, он скажет "5 пользователей". Если размер 1 или 0, он будет указывать "1 пользователь" или "0 пользователь". Прямо сейчас я делаю это с операторами if-else, чтобы определить, следует ли печатать "s" или нет, что является утомительным.

Мне интересно, есть ли библиотека пользовательских тегов JSP с открытым исходным кодом, которая позволяет мне это сделать. Я знаю, что могу написать сам... в основном, у него будет 2 параметра: <lib:display word="user" collection="userList" />. В зависимости от размера коллекции он будет определять, добавлять ли "s" или нет. Но тогда эта реализация не будет слишком надежной, потому что мне также нужно обращаться с "ies", а некоторые слова не используют ни одного из них. Таким образом, вместо создания наполовину испеченного инструмента, я надеюсь, что там будет более надежная библиотека, которую я мог бы использовать сразу. Я не слишком беспокоюсь о том, чтобы префикс слова был/в этом случае.

Я использую Java, кстати.

Большое спасибо.

Ответы

Ответ 1

Посмотрите inflector, проект java, который позволяет вам выполнять Noun.pluralOf("user") или Noun.pluralOf("user", userList.size()), и который обрабатывает кучу вариаций и необычных случаев (человек- > люди, буханки- > хлебы и т.д.), а также позволяет вам определять настраиваемые правила отображения, когда это необходимо.

Ответ 2

Хм, я не совсем понимаю, зачем вам нужна библиотека. Я бы подумал, что функция сделать это тривиальна:

public String singlePlural(int count, String singular, String plural)
{
  return count==1 ? singular : plural;
}

Звонки выглядят так:

singlePlural(count, "user", "users");
singlePlural(count, "baby", "babies");
singlePlural(count, "person", "people");
singlePlural(count, "cherub", "cherubim");
... etc ...

Возможно, эта библиотека выполняет целую кучу других вещей, которые делают ее полезной. Я полагаю, вы могли бы сказать, что он поставляет словарь того, что все формы множественного числа, но в любой заданной программе вам не нравятся множественные числа всех слов на этом языке, только те, которые вы используете в этой программе. Я предполагаю, что если слово, которое может быть сингулярным или множественным, неизвестно во время компиляции, если оно что-то вводит пользователем, тогда я бы хотел использовать сторонний словарь, а не пытаться сам его создать.

Edit

Внезапно мне приходит в голову, что то, что вы искали, было функцией для создания множественных чисел в целом, включая набор правил, таких как "обычно просто добавление", но если слово заканчивается на "y", измените "y", to 'sies', если он заканчивается на 's', меняют его на ses ',... "и т.д. Я думаю, что на английском языке это было бы невозможно для какой-либо практической цели: слишком много особых случаев, таких как" человек/люди "" и "ребенок/дети" и т.д. Я думаю, что лучшее, что вы могли бы сделать, было бы иметь общее правило "добавить", возможно, несколько других распространенных случаев, а затем длинный список исключений. Возможно, на других языках можно было бы составить довольно простое правило.

Итак, как я говорю, если слово не известно во время компиляции, а поступает с некоторого пользовательского ввода, то да, крайне желательно словарь сторонних разработчиков.

Ответ 3

Это осложняется в языках, отличных от английского, что инфлектор стремится поддерживать в будущем.

Я знаком с чехом, где user = uživatel и:

1 uživatel
2 uživatelé
3 uživatelé
4 uživatelé
5 uživatelů

...

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

Ответ 4

Эта функциональность встроена в Ruby on Rails. Я не знаю точно, где, но его должно быть достаточно легко найти в исходном коде, а затем вы могли бы просто вырезать код.

РЕДАКТИРОВАТЬ: Найдите код:

  • inflector.rb (очень полезные комментарии!)
  • inflections.rb (расширенный список слов)

Если я правильно помню, это в основном вопрос добавления "s" к большинству слов, хотя я считаю, что есть список (вероятно, хэш, словарь ошибок) некоторых общих исключений. Примечателен переход от "человека" к "людям":)

Конечно, вы были бы в мире боли, если бы решили, что хотите интернационализировать это на других языках, кроме английского. Добро пожаловать в мир сильно нерегулярных грамматик и удачи!