如何从多个可选选项中获取单个值?

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, Horizo​​ntal Striped, Button Up Shirt = 1 和 Blue, X-Small, Horizo​​ntal Striped, Button Up Shirt = 2 等,

根据所做的选择找到值的正确方法是什么?比如Black, Large, Horizo​​ntal Striped, T-shirt的选择值应该是多少,你是怎么解决的?我不能完全把我的手指放在它身上,我尝试过的一切似乎都没有成功。这可能是一个简单的解决方案,我现在只是脑死亡。

【问题讨论】:

【参考方案1】:

您可以像字符串一样连接选项的值(通过将每个单独的值转换为字符串,连接它们,然后将其转换为整数)。因此,Black, Large, Horizo​​ntal Striped, T-Shirt 将是 4302。这应该保证没有两个可能的组合具有相同的标识符(尽管我不是数学高手)。

【讨论】:

是的,这就是 OP 想要的方式,这经常用于将多个二元选项封装成一个值 :-) 我知道答案很简单。这应该做得很好。谢谢! 没想到。在我的情况下,我没有任何超过 9 的选项,所以我认为这不会成为问题。仍然很高兴知道这些限制。 如果任何字段有超过 10 个选项,您可以只使用两位数字字段(记得在 1 位数字选项前放一个 0) 糟糕,不小心删除了我上次回复所针对的评论。我曾说过,只要没有任何项目可以用两位数表示,该解决方案就可以正常工作。因此,如果 Charcoal = 10,您将得到 10302,并且没有分隔符来指示下一个类别的开始位置(例如逗号分隔值)。这可能会导致重叠并且不再产生唯一编号。【参考方案2】:

在我看来,您的场景映射到具有 4 个枚举的 Shirt 类 - ColorSizeDesignType。该类具有公开所有 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, Horizo​​ntal Striped, T-shirt 可能是值 (4 + 4*2^8 + 1*2^16 + 3*2^24)。

只是不要认为值被挤得紧紧的,你自然会解决的。

【讨论】:

以上是关于如何从多个可选选项中获取单个值?的主要内容,如果未能解决你的问题,请参考以下文章

如果多次单击一个选项,有没有办法只为 setOnItemClickListener 获取单个值而不是获取多个值?

使用 Python 模块 argparse 的单个选项的自定义值名称和多个属性

如何在列表视图中获取所选项目的值 - Android

在 Bash 中使用 getopts 检索单个选项的多个参数

如何将多个选项传递给 Firefox 中引导轮播的可选选项对象?

合并来自谷歌表格列的记录