Эффективный способ обработки сингулярного/множественного слова на основе некоторого размера коллекции
В моих рабочих проектах много примеров, где мне нужно отображать размер какой-либо коллекции в предложении. Например, если размер коллекции равен 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. Я не знаю точно, где, но его должно быть достаточно легко найти в исходном коде, а затем вы могли бы просто вырезать код.
РЕДАКТИРОВАТЬ: Найдите код:
Если я правильно помню, это в основном вопрос добавления "s" к большинству слов, хотя я считаю, что есть список (вероятно, хэш, словарь ошибок) некоторых общих исключений. Примечателен переход от "человека" к "людям":)
Конечно, вы были бы в мире боли, если бы решили, что хотите интернационализировать это на других языках, кроме английского. Добро пожаловать в мир сильно нерегулярных грамматик и удачи!