0

我正在我的应用程序中集成伪搜索功能。我有一个搜索小部件,它给出了搜索提示列表(这些提示来自 fts3 sqlite 表)。当用户点击搜索提示时,相应的 sqlite 表将填充 listView。

我需要一种方法来确定将根据所选搜索提示填充列表的表。我正在考虑做这样的事情:

switch(search_hint){
    case(search_hint_1):  useTable(table_1);
                          break;
    case(search_hint_2):  useTable(table_2);
                          break;
    case(search_hint_3):  useTable(table_1 + table_2); // Case when I need to use
                          break;                       // two tables for ListView
}

我确信这是一个可能的解决方案,但是如果有几个(数百或数千)个案例怎么办?谁能建议一个更好的方法来面对这个?

4

6 回答 6

3

如果可以的话,将映射变成某种对的数组,然后你可以用 afor-loop和 an遍历它们if。类似于我在重构重复保护语句中的建议。您需要创建一个包含提示和表格的类。

要么,要么创建一个实际的地图。并使用 search_hint 作为键。

Map< /*insert hint type here*/,Table> mapTable;

例如。

于 2013-02-05T09:10:53.893 回答
2

我认为按照我的想法可行的方法..使用HashMap键值对..(仅限伪代码)

Map<Integer,String> mapTable = new HashMap<Integer,String>();
mapTable.put(search_hint_1,table_1);
.
.
.

只需访问useTable(mapTable.get(search_hint));

于 2013-02-05T09:12:36.137 回答
1

switchstatement 是面向对象设计中的一种反模式(参见Object Thinking)。您应该改用继承。

于 2013-02-05T09:21:04.370 回答
0

使用枚举器。喜欢 :

private static enum DojoDecider {   

    search_hint_1(table_1),
    search_hint_2(table_2);     

    private Table var;      

    private DojoDecider(Table var) {
        this.var = var;
    }

    @SuppressWarnings("unused")
    public Table getVar() {
        return var;
    }           
}
于 2013-02-05T09:15:55.337 回答
0
final int[] hintArray = {search_hint_1, search_hint_2, search_hint_3};
final String[] tableArray = {table_1, table_2, table_3};

private Map<Integer,String> hintMap = new HashMap<Integer,String>();

// Populate the map, probably at onCreate() of your activity
for(int i=0; i<hintArray.length; i++) {
    hintMap.put(hintArray[i], tableArray[i]);
}

// When you want to get it
useTable(hintMap.get(search_hint));
于 2013-02-05T09:16:43.967 回答
0

将信息放入搜索提示表中。您需要考虑一下您拥有的不同案例以及如何将它们分解为可配置的小块。

search_hint_1  table_1
search_hint_2          table_2
search_hint_3  table_1 table_2
于 2013-02-05T09:14:45.397 回答