我正在我的应用中集成伪搜索功能。我有一个搜索小部件,它给出了一个搜索提示列表(这些提示来自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
}
我确信这是一个可能的解决方案,但如果有几个(数百或数千)个案例怎么办?任何人都可以建议更好的方式来面对这个问题吗?
答案 0 :(得分:3)
如果可以,请将映射制作成某种对的数组,然后您可以使用for-loop
和if
完成所有这些对。与Refactoring repetitive guard statements中的建议相似。
您需要创建一个类似于保存提示和表的类。
要么是,要么创建一个实际的地图。并使用search_hint作为密钥。
Map< /*insert hint type here*/,Table> mapTable;
例如。
答案 1 :(得分:2)
我认为按照我的想法可行的方式..使用 HashMap键值对..(只有伪代码)
Map<Integer,String> mapTable = new HashMap<Integer,String>();
mapTable.put(search_hint_1,table_1);
.
.
.
只需访问useTable(mapTable.get(search_hint));
答案 2 :(得分:0)
将信息放在搜索提示表中。 你需要仔细考虑一下你所拥有的不同情况,以及如何将它们分解成可配置的小部分。
search_hint_1 table_1
search_hint_2 table_2
search_hint_3 table_1 table_2
答案 3 :(得分: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;
}
}
答案 4 :(得分: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));
答案 5 :(得分:0)
switch
语句是面向对象设计中的反模式(参见Object Thinking)。你应该使用继承。