我有一个写在onTextChanged上的搜索方法。这将搜索Hashmap的Arraylist。这里的问题是我只获得大写或小写的搜索结果。
如何通过使其不区分大小写来解决此问题。
这是我的代码:
public void onTextChanged(CharSequence s, int start, int before, int count)
{
song = 2;
songsList2.clear();
for (HashMap<String, String> map : songsList)
{
if(map.get(KEY_TITLE).contains(s))
{
HashMap<String, String> map2 = new HashMap<String, String>();
// adding each child node to HashMap key => value
map2.put(KEY_ID, map.get(KEY_ID));
map2.put(KEY_TITLE, map.get(KEY_TITLE));
map2.put(KEY_ARTIST, map.get(KEY_ARTIST));
map2.put(KEY_DURATION, map.get(KEY_DURATION));
map2.put(KEY_THUMB_URL, map.get(KEY_THUMB_URL));
songsList2.add(map2);
adapter=new LazyAdapter(CustomizedListView.this, songsList2);
list.setAdapter(adapter);
}
}
adapter.notifyDataSetChanged();
}
谢谢!
答案 0 :(得分:4)
是的,contains
方法区分大小写。如果您不想这样做,您可以编译正则表达式模式并使用它,或者只是将搜索的值设为小写,然后检查它,就像
if(map.get(KEY_TITLE).toLowerCase().contains(s)...
假设char
序列的情况相同。
修改强>:
正如评论中所指出的,为了确保在没有假设char
序列案例的情况下进行匹配,您必须使用toLowerCase
来强制搜索短语到同一个案例
if(map.get(KEY_TITLE).toLowerCase().contains(s.toString().toLowerCase())...
答案 1 :(得分:1)
首先避免在使用接口时使用具体类。据我所知songsList
是HashMap
的列表或数组。将定义更改为List<Map<String, String>>
。现在使用TreeMap
代替HashMap
,但在创建实例时传递String.CASE_INSENSITIVE_ORDER
比较器:
Map<String, String> map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
现在您无需更改代码。你可以放在那里&#34;黄色潜水艇&#34;并获得黄色潜水艇&#34;或者&#34;黄色潜水艇&#34;管他呢。但是存储在地图中的实际值仍然是&#34;黄色潜水艇&#34; (你输入的值),所以如果你迭代你得到的条目&#34;纠正&#34;值。