如果二维字符串数组包含特定字符串,我正在创建一个搜索来过滤它。用户可以边拨打与拨号盘(0-9)对应的号码边进行搜索。例如,如果键入数字 56,则搜索将查找包含“56”、“JJ”、“JM”、“JO”、“KM”、“KN”、“KO”、“LM”、二维数组中的“LN”、“LO”。
我的方法是将可能性存储在一个数组中,然后循环遍历二维数组以查看其中是否包含序列;嵌套循环。在我花几个小时编写它之前,我想知道是否有更好的方法来做到这一点或类似的东西的链接。
一种方法是(如果它必须是一个数组)基于输入的字母构建可能名称的子集,并在输入每个字母后比较子集而不是完整集。
例如,如果您从
Bill, Bob, Conroy, Fran, Riley, Shelley
输入 2 (A,B,C) 后,您将得到
Bill, Bob, Conroy, (Fran if contains)
然后在输入 6 (M,N,O) 后,你会留下
Bob, Conroy, (Fran if contains)
如果 Starts With 为了做到这一点,您需要一个当前已匹配的索引的集合,List 可能是最好的实现
List<Integer> indicesMatched;
如果包含 您将需要存储匹配字符串的索引以及字符串中第一个匹配字母所在位置的索引,可能作为映射(或列表并误用 Point 类)
Map<Integer, Integer> matched; // where the key is the array index and the value is the string index
然后你可以用第一组匹配的索引填充它。然后,当您比较第二个数字/字母时,仅使用存储在列表中的那些索引,并为每个删除那些与第二个字母不匹配的索引
伪代码:(用于开头)
// First key press
// For each entry in your array
// If a match
// Add to matched index List
// Second Key Press -- Repeat this step for each subsequent key press
// For each index in list
// Get the entry at that index
// If not a match in second letter
// Remove the index from list
伪代码:(用于 contians)
// First key press
// For each entry in your array
// If a match
// Add to matched index map
// Second Key Press -- Repeat this step for each subsequent key press
// For each index in map
// Get the entry at that index
// If not a match in second letter (based on the stored string index)
// Remove the index from map
如果您有一个包含所有搜索字符串的数组(在这种情况下,我猜是名称),那么我会这样写:
考虑以下情况:
Adam
James
Kevin
Laurie
Lisa
Steve
用户输入一个 5,所以我们循环并确定:
start = 1; //index of "James"
end = 4; //index of "Lisa"
所以我们的数组下降到
James
Kevin
Laurie
Lisa
现在用户输入另一个数字,我们用这个(小得多,给定一个完整的地址簿)数组再次执行此操作,但这次比较每个名称中的第二个字母,消除不适合可能性的索引。因此,再次,如果用户现在输入 2,这意味着可能的字母是 A、B 和 C。该数组再次缩小为:
James
Laurie
等等。