我正在应用程序中集成伪搜索功能。我有一个搜索小部件,它提供了一个搜索提示列表(这些提示来自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
}
我相信这是一个可能的解决方案,但如果有几个(数百或数千)案例呢?有人能提出一个更好的方法来面对这一点吗?
如果可以的话,将映射到某种类型的对的数组中,然后只需使用for-loop
和if
即可遍历它们。类似于我在重构重复的guard语句中的建议。您需要创建一个类似于pair的类,该类包含提示和表。
要么这样,要么创建一个实际的地图。并使用search_hint作为关键字。
Map< /*insert hint type here*/,Table> mapTable;
例如。
根据我的想法,我认为可行的方法。。使用HashMap键值对。。(仅伪码)
Map<Integer,String> mapTable = new HashMap<Integer,String>();
mapTable.put(search_hint_1,table_1);
.
.
.
只需访问useTable(mapTable.get(search_hint));
switch
语句是面向对象设计中的反模式(请参阅对象思维)。您应该使用继承。
将信息放入搜索提示表中。你需要考虑一下你所拥有的不同案例,以及如何将它们分解成可配置的小块。
search_hint_1 table_1
search_hint_2 table_2
search_hint_3 table_1 table_2
使用枚举器。类似:
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;
}
}
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));