0

我的问题是我在 Android 应用程序中有大约 1000 多条记录

string field1;
string field2;
string field3;
string field4;
//...

我想在这组记录中搜索并在两个字段(field1field2)上获得最佳结果。

目前,我阅读每条记录并compare()(字符串比较)与我要搜索的文本,这需要很长时间。

执行搜索的最佳方法是什么?

  1. 将每条记录存储在 SQLite DB 中并执行“选择查询”
  2. 哈希映射
  3. ? 还有其他建议吗?

或者可以创建记录索引并进行搜索。

4

1 回答 1

0

如果您想搜索完全匹配的内容,我会尝试ArrayListMyAppRecord哪里

public class MyAppRecord {
    private String record;
    private int deviance;
}

并为每条记录获取要查找的字符串的偏差:

public static int getLevenshteinDistance (String s, String t) {
    if (s == null || t == null) {
      throw new IllegalArgumentException("Strings must not be null");
    }    
    int n = s.length(); // length of s
    int m = t.length(); // length of t

    if (n == 0) {
      return m;
    } else if (m == 0) {
      return n;
    }

    int p[] = new int[n+1]; //'previous' cost array, horizontally
    int d[] = new int[n+1]; // cost array, horizontally
    int _d[]; //placeholder to assist in swapping p and d

    // indexes into strings s and t
    int i; // iterates through s
    int j; // iterates through t

    char t_j; // jth character of t

    int cost; // cost

    for (i = 0; i<=n; i++) {
       p[i] = i;
    }

    for (j = 1; j<=m; j++) {
       t_j = t.charAt(j-1);
       d[0] = j;

       for (i=1; i<=n; i++) {
          cost = s.charAt(i-1)==t_j ? 0 : 1;
          // minimum of cell to the left+1, to the top+1, diagonally left and up +cost                         
          d[i] = Math.min(Math.min(d[i-1]+1, p[i]+1),  p[i-1]+cost);  
       }

       // copy current distance counts to 'previous row' distance counts
       _d = p;
       p = d;
       d = _d;
    }

    // our last action in the above loop was to switch d and p, so p now
    // actually has the most recent cost counts
    return p[n];
  }
}

将其保存到您的 -object 中MyAppRecord,最后按其-objects 对您ArrayList进行排序。devianceMyAppRecord

请注意,这可能需要一些时间,具体取决于您的记录集。请注意,无法通过搜索 dog 来判断 dogA 或 dogB 是否位于列表中的某个位置。

阅读 Levensthein 距离,了解它的工作原理。您可能会想到对可能长/短的字符串进行排序,以获得适合您可能拥有的阈值的距离。

也可以将“足够好”的结果复制到不同的ArrayList.

于 2013-01-23T12:31:56.800 回答