Java 根据集合大小处理单数/复数单词的有效方法

Java 根据集合大小处理单数/复数单词的有效方法,java,jsp,jsp-tags,Java,Jsp,Jsp Tags,在我的工作项目中,有许多实例需要在一个句子中显示某个集合的大小。例如,如果集合的大小为5,则会显示“5个用户”。如果大小为1或0,则会显示“1用户”或“0用户”。现在,我正在使用if-else语句来确定是否打印“s”,这很无聊 我想知道是否有一个开源JSP自定义标记库允许我完成这项工作。我知道我可以自己写一本。。。基本上,它将有两个类似这样的参数:。根据集合大小,它将决定是否附加“s”。但是,这个实现不会太健壮,因为我还需要处理“ies”,有些词不使用这些词。因此,我希望有一个更强大的库,我可以

在我的工作项目中,有许多实例需要在一个句子中显示某个集合的大小。例如,如果集合的大小为5,则会显示“5个用户”。如果大小为1或0,则会显示“1用户”或“0用户”。现在,我正在使用if-else语句来确定是否打印“s”,这很无聊

我想知道是否有一个开源JSP自定义标记库允许我完成这项工作。我知道我可以自己写一本。。。基本上,它将有两个类似这样的参数:
。根据集合大小,它将决定是否附加“s”。但是,这个实现不会太健壮,因为我还需要处理“ies”,有些词不使用这些词。因此,我希望有一个更强大的库,我可以马上使用,而不是创建一个半生不熟的工具。在这种情况下,我不太担心在单词前面加is/are

顺便说一下,我使用Java


非常感谢。

此功能内置于Ruby on Rails中。我不知道具体在哪里,但应该很容易在源代码中找到,然后你可以简单地抄袭代码

编辑:找到一些代码:

  • (非常有用的评论!)
  • (广泛词表)
如果我没记错的话,这主要是在大多数单词后面加上一个“s”,尽管我相信有一些常见的例外情况(可能是散列、错误字典)。值得注意的是从“人”到“人”的转换:


如果你决定将其国际化为英语以外的其他语言,你当然会感到痛苦。欢迎来到高度不规则语法的世界,祝你好运

看看一个java项目,它允许您执行
名词.pluralOf(“用户”)
,或者
名词.pluralOf(“用户”,userList.size())
,并处理一系列变化和异常情况(个人->人,面包->面包等),还允许您在必要时定义自定义映射规则。

嗯,我不太明白你为什么需要一个图书馆。我认为这样做的功能是微不足道的:

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 ...
也许这个图书馆做了很多其他的事情使它变得有用。我想你可以说,它提供了一本词典,说明了所有复数形式是什么,但在任何给定的程序中,你都不关心语言中所有单词的复数形式,只关心你在这个程序中使用的单词。我想如果单数或复数的单词在编译时不为人所知,如果它是用户输入的,那么我想要一个第三方词典,而不是自己建立一个

编辑

我突然想到,你要找的是一个生成复数的函数,包含了一系列规则,比如“通常只需添加's',但如果单词以'y'结尾,则将'y'改为'ies',如果它以's'结尾,则将其改为'ses',”我认为在英语中,这对于任何实际目的来说都是不可能的:有太多的特殊情况,如“个人/人”和“儿童/儿童”等。我认为你能做的最好的办法是有一个通用的“添加一个”规则,可能还有一些其他常见情况,然后是一长串例外情况。也许在其他语言中,人们可以想出一个相当简单的规则


正如我所说,如果这个词在编译时不为人所知,但来自用户的输入,那么是的,第三方词典是非常可取的。

这在英语以外的语言中变得复杂,屈折符希望在将来支持它

我熟悉捷克语,其中user=uživatel和:

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

您可以看到为什么使用硬编码单数+复数编写的程序将无法使用i18n


编辑:
Java11允许您使用以下各项:

ChoiceFormat fmt = new ChoiceFormat("1#uživatel | 1.0< uživatelé | 4< uživatelů");
System.out.println(fmt.format(1));
System.out.println(fmt.format(4));
System.out.println(fmt.format(5));
ChoiceFormat fmt=新的ChoiceFormat(“1#uživatel 1.0

Java提供的丰富内容令人惊叹!谢谢你提供的这些信息,这可以帮我和其他人省去一次进入RoR内部的旅程+1.下一个:KitchenSink.jar:)好的。。。说真的,哇我以为你只是在开我玩笑,事实上,这是真的!太谢谢你了,我真的很快就会搞糟的@卡尔:是的,我们也需要kitchenSink.jar。如果你不能像我一样访问java.net上的拐点项目,你可以从这里得到:我在github上也看到了拐点。不确定是不是同一个。。。从他们的文档中可以看出:“对于Wiktionary中的163518个单词,Evo Incomector为其中68.4%返回了正确答案。”。因此,我在使用之前会非常小心?谢谢!见鬼,如果我要国际化,我还不如自己编一种语言,一个复数词总是以YAY结尾。。。例:5个用户(Y.)这就是为什么我喜欢不在乎单数或复数的语言,比如Bahasa Melayu,例如:“1个橙子”,“2个橙子”,而不管x个用户真正地你是说在捷克有一个1的表格,另一个2-4的表格,还有另一个5的表格?真有趣。为什么是5而不是6或42?不同的单词有不同的数字吗?我不是语言学家,但这听起来很奇怪,很有趣。真的。而且不仅仅是捷克人。你可能有兴趣在这里阅读关于“dual”作为“单数”和“复数”的补充:@Jay我不懂捷克语,但其他语言的单词有性别(有点像英语中的演员/女演员,仅适用于所有单词)和单数/复数形式。此外,在罗马尼亚语中,根据名词在句子中扮演的角色,后缀也会有所不同。虽然你在英语中可能会说“to the user”,但我们会在user(utilizator->utilizatorulu)的单词中添加后缀“-ului”