1

如果二维字符串数组包含特定字符串,我正在创建一个搜索来过滤它。用户可以边拨打与拨号盘(0-9)对应的号码边进行搜索。例如,如果键入数字 56,则搜索将查找包含“56”、“JJ”、“JM”、“JO”、“KM”、“KN”、“KO”、“LM”、二维数组中的“LN”、“LO”。

我的方法是将可能性存储在一个数组中,然后循环遍历二维数组以查看其中是否包含序列;嵌套循环。在我花几个小时编写它之前,我想知道是否有更好的方法来做到这一点或类似的东西的链接。

4

2 回答 2

1

一种方法是(如果它必须是一个数组)基于输入的字母构建可能名称的子集,并在输入每个字母后比较子集而不是完整集。

例如,如果您从

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
于 2013-07-04T20:38:33.093 回答
0

如果您有一个包含所有搜索字符串的数组(在这种情况下,我猜是名称),那么我会这样写:

  1. 用户输入一个数字,比如说 5
  2. 你现在知道第一个字母是 J、K 或 L
  3. 搜索您的数组,直到找到第一个 J,设置一个索引标记,称为“开始”
  4. 继续搜索,直到找到以 L 开头的最后一个元素,并添加一个索引标记,称为“end”
  5. 重复下一个数字,但这次不是搜索整个数组,而是从“开始”标记搜索到“结束”标记,并根据需要重新调整两者。

考虑以下情况:

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

等等。

于 2013-07-04T19:28:33.050 回答