如何按前缀对字符串进行分组

Posted

技术标签:

【中文标题】如何按前缀对字符串进行分组【英文标题】:How to group strings by prefix 【发布时间】:2010-04-08 09:27:55 【问题描述】:

我正在编写一个 Winform UI,用户必须在其中选择一个客户。 (由于我无法控制的原因,我仅限于使用下拉列表、文本字段、复选框、单选按钮的 UI - 即没有花哨的特殊 UI 控件)

情况

有很多客户(例如一千) 如果我将所有客户都放在一个下拉列表中,那么客户甚至无法轻松查看所有客户。此外,从数据库中删除所有客户以填充下拉菜单需要很长时间 我的想法是有两个组合框,第一个按姓氏列出客户组,例如电话簿“Aa-Ac”、“Ad-Ade”、“Adf-B”,选择第一个组合框,它将第二个范围限定为可管理的一组客户名称(例如不超过 40 个名称)

问题

我需要一种合理的方式对他们的姓名进行分组,以便客户清楚地知道哪个组包含该姓名。 IE。给定一组名称,我需要将其分桶然后 int "Aa-Ac"。

评论

我不需要解决名称数量庞大的一般问题 - 根据我们的数据,我们知道 1000 个名称是我们的用户将遇到的最大值。 如果有其他技术,请分享,但我特别感兴趣的是关于如何确定存储桶(“Aa-Ac”等)的具体问题的答案

【问题讨论】:

【参考方案1】:

其他技巧: 我会将 ComboBox 与 TextBox 结合起来(这是您的文本字段吗?还是您的意思是只读标签?),因此用户可以输入一些第一个字母,ComboBox 将显示以这些字母开头的所有条目。在完全匹配的情况下,它甚至可以跳过 ComboBox 的使用并加快速度。

【讨论】:

【参考方案2】:

Tanascious 的建议大部分都在正确的轨道上,但我不认为你没有两个组件。自从我进行任何 C# 开发以来已经有一段时间了,但如果我没记错的话,单个组合框(列表框?)非常适合在数百个条目之间进行选择,因为它支持按类型查找导航,即如果名称用户正在寻找的是“Doe,John”,在选择组件时键入“do”将在几乎所有情况下将用户带到几个条目中,大部分时间都是准确的用户。在公共网页上,所有内容都需要点击一下,但对于每天使用此界面的用户来说,这通常没有问题。

【讨论】:

【参考方案3】:

我认为在确定 gui 应该如何工作之前,你必须三思而后行,但如果你真的想去冒险,你会按照以下思路做一些事情:

第 1 步,创建存储桶:

确定所需的存储桶大小(以 40 为例)。 对名称进行排序。 将前 40 个名称设为第一个存储桶, 41-80 命名第二个存储桶等,直到您创建了所有存储桶。

第 2 步,确定存储桶的“名称”(“Adf-B”等):

让我们使用bucket[i].Left来指代第i个bucket名称的左边部分(上面的“Adf”)和bucket[i].Right到右边(“B”) 让我们使用 bucket[i].Names 来引用此存储桶中的 40 个名称的列表 现在假设我们有一个函数可以确定我们必须使用多少个字符来区分两个字符串(我们称之为 CharsNeeded),我们可以比较彼此相邻的桶的结束/开始并从中提取名称.

像这样:

bucket[i].Left = bucket[i].Names.First().Substring(0, CharsNeeded(bucket[i].Names.First(), bucket[i-1].Names.Last()));
bucket[i].Right = bucket[i].Names.Last().Substring(0, CharsNeeded(bucket[i].Names.Last(), bucket[i+1].Names.First()));

CharsNeeded 可以这样实现,例如:

int CharsNeeded(string str1, string str2)

  int i=0;
  while (i < str1.Length && i < str2.Length && str1[i] == str2[i])
    i++;
  return i + 1;

另外,请注意边缘情况,因为我没有检查存储桶数组上的索引是否超出范围。

【讨论】:

以上是关于如何按前缀对字符串进行分组的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python itertools.groupby() 按字符串的第一个字符对字符串列表进行分组?

Python:如何按对象的特征或属性对对象列表进行分组? [复制]

按项目名称对交易进行分组

按名称的第一个字符对 tableView 进行分组

按嵌套 tibble 中作为字符串向量给出的变量对 tibble 进行分组

按最后一个字符分组列表