如何从多个可选选项中获取单个值?
Posted
技术标签:
【中文标题】如何从多个可选选项中获取单个值?【英文标题】:How to get a single value from multiple selectable options? 【发布时间】:2010-10-31 01:34:35 【问题描述】:我的情况是我需要获得一个值来定义多个选择选项的组合。这是我想要做的一个小例子。
用户正在购买一件衬衫。用户在购买衬衫时可以选择许多不同的选项。只能(并且必须)从每个选择组中选择一个选项。选择组可以表示为单选按钮列表或下拉列表,任何只允许对每个组进行一个选择的方式。例如:
衬衫颜色:红色、蓝色、绿色、黑色、白色或黄色 衬衫尺码:X-小、小、中、大、X-大、XX-大 衬衫设计:横条纹、竖条纹、波点、斜条纹、无设计 衬衫类型:纽扣衬衫、Polo 衫、T 恤、长袖 T 恤、运动衫
因此,为了解决这个问题,每个组只能选择一个选项。使用可能的选择,我总共获得了 900 种不同的变体 (6x6x5x5)。鉴于以下选项具有以下值:
红色 = 1,蓝色 = 2,绿色 = 3,黑色 = 4,白色 = 5,黄色 = 6 X-Small = 0,Small = 1,Medium = 2,Large = 3,X-Large = 4,XX-Large = 5 横条纹 = 0,竖条纹 = 1,圆点 = 2,斜条纹 = 3,无设计 = 4 纽扣衬衫 = 0,Polo 衫 = 1,T 恤 = 2,长袖 T 恤 = 3,运动衫 = 4
Red, X-Small, Horizontal Striped, Button Up Shirt = 1 和 Blue, X-Small, Horizontal Striped, Button Up Shirt = 2 等,
根据所做的选择找到值的正确方法是什么?比如Black, Large, Horizontal Striped, T-shirt的选择值应该是多少,你是怎么解决的?我不能完全把我的手指放在它身上,我尝试过的一切似乎都没有成功。这可能是一个简单的解决方案,我现在只是脑死亡。
【问题讨论】:
【参考方案1】:您可以像字符串一样连接选项的值(通过将每个单独的值转换为字符串,连接它们,然后将其转换为整数)。因此,Black, Large, Horizontal Striped, T-Shirt 将是 4302。这应该保证没有两个可能的组合具有相同的标识符(尽管我不是数学高手)。
【讨论】:
是的,这就是 OP 想要的方式,这经常用于将多个二元选项封装成一个值 :-) 我知道答案很简单。这应该做得很好。谢谢! 没想到。在我的情况下,我没有任何超过 9 的选项,所以我认为这不会成为问题。仍然很高兴知道这些限制。 如果任何字段有超过 10 个选项,您可以只使用两位数字字段(记得在 1 位数字选项前放一个 0) 糟糕,不小心删除了我上次回复所针对的评论。我曾说过,只要没有任何项目可以用两位数表示,该解决方案就可以正常工作。因此,如果 Charcoal = 10,您将得到 10302,并且没有分隔符来指示下一个类别的开始位置(例如逗号分隔值)。这可能会导致重叠并且不再产生唯一编号。【参考方案2】:在我看来,您的场景映射到具有 4 个枚举的 Shirt
类 - Color
、Size
、Design
和 Type
。该类具有公开所有 4 个枚举类型的私有成员的公共属性。
因此,一个衬衫实例可以设置所有 4 个属性,而不必担心 900 种可能的组合。此外,一个单独的 Shirt 实例将仅具有每个属性的一种可能组合。您可以以直观的方式查询设置的值的类型,而无需记住哪个整数值映射到什么类型的属性。这正是枚举的用途! ;-)
【讨论】:
【参考方案3】:您真的需要为每个选项组合提供一个单一的数值吗?或者您只是需要某种方法将用户的选择分组到一个已知单元中?
如果是后者,我建议创建一个Shirt
类,为每种选择类型(颜色、大小、设计和类型)设置属性。您甚至可以将这些值设为枚举值,因为每个属性的值数量有限。
一旦用户的选择完全完成,您可以检查Shirt
实例的每个属性的值,以了解如何将最终的衬衫放在一起。
【讨论】:
是的,不幸的是,每个组合我都需要一个数值。我知道在我描述的情况下这样做没有多大意义,但它是一个非常简洁的例子来说明我在寻找什么。 既然需要一个数字,那么我可能会选择 Matthew Jones 的答案。【参考方案4】:一种方法是为不同类型的信息分配不同大小的数字范围:
Red = 1, Blue = 2, Green = 3, Black = 4, White = 5, Yellow = 6
X-Small = 100, Small = 200, Medium = 300, Large = 400, X-Large = 500, XX-Large = 600
Horizontal Striped = 1000, Vertical Stripes = 2000, Polka Dots = 3000, Diagonal Stripes = 4000, No Design = 5000
Button Up Shirt = 10000, Polo Shirt = 20000, T-Shirt = 30000, Long Sleeve T-Shirt = 40000, Sweatshirt = 50000
这意味着 42304 是一件黑色长袖 T 恤,带有中号竖条纹。
就个人而言,我可能会存储和处理不同的属性和单独的值,除非有特定要求禁止这样做。
【讨论】:
【参考方案5】:它必须是一个单一的值吗?枚举集合让我觉得最合乎逻辑的选择:
ShirtColor Color;
ShirtSize Size;
ShirtPattern Pattern;
ShirtType Type;
enum ShirtColor Red, Blue, Green, Black, White, Yellow;
...
如果它必须是单个值,您可以选择一个 Int32,并为要存储的四条信息中的每一条使用该 int 的每个字节中的每个标志。为您提取的每个特征使用bitmask。比如:
enum ShirtColor : byte Red=0, Blue=1;
enum ShirtSize : byte Small=0, Large=1;
int shirtInfo = 0x0001;
int colorOffset = 0;
int sizeOffset = 8;
ShirtColor color = (ShirtColor)(shirtInfo << colorOffset);
ShirtSize size = (ShirtSize)(shirtInfo << sizeOffset);
Console.WriteLine(Enum.GetName(typeof(ShirtColor), color));
Console.WriteLine(Enum.GetName(typeof(ShirtSize), size));
【讨论】:
【参考方案6】:衬衫颜色:红色、蓝色、绿色、黑色、白色或黄色 衬衫尺码:X 小号、小号、中号、大号、X-大号、XX-大号 衬衫设计:横条纹、竖条纹、波点、斜条纹、无设计 衬衫类型:纽扣衬衫、Polo 衫、T 恤、长袖 T 恤、运动衫
请注意,这里有 4 个类别,每个类别都有几个值。您可以使用 4 字节整数和每个字节表示一个类别。
那么 Black, Large, Horizontal Striped, T-shirt 可能是值 (4 + 4*2^8 + 1*2^16 + 3*2^24)。
只是不要认为值被挤得紧紧的,你自然会解决的。
【讨论】:
以上是关于如何从多个可选选项中获取单个值?的主要内容,如果未能解决你的问题,请参考以下文章
如果多次单击一个选项,有没有办法只为 setOnItemClickListener 获取单个值而不是获取多个值?
使用 Python 模块 argparse 的单个选项的自定义值名称和多个属性
在 Bash 中使用 getopts 检索单个选项的多个参数