我正在开发一个Android应用程序,我从SQLite数据库中获取名称列表(字符串)。然后,我将它们显示在Cardviews列表中。
我还给了一个子字符串,所以我想检查原始List中的任何元素是否包含该子字符串。
我在SQLite查询中使用LIKE时遇到问题,所以我只是用try{ } catch (Exception e) { }
修复了它,但我对此感觉不太舒服。
无论如何,由于我最初将所有名称存储在字符串列表中,因此我不需要再次从数据库中获取新名称,我可以在原始的字符串列表中搜索它们。但我不知道如何。
例如,让我们说String of List有这5个元素:
Hello
Wall
Helicopter
Chair
Hell
我给了子串Hel
。我应该获得Hello
,Helicopter
和Hell
字符串,因为它们都包含子字符串Hel
。
关于如何实现这一目标的任何想法?
这不是我想以这种方式修复它。我真的想知道什么是最有效的,,如果从数据库中再次检索数据,或者从字符串列表中搜索它。
编辑:我原来说我使用的是CONTAINS查询,但我错过了这个词。我只是想要LIKE查询。我实际上正在使用它,它工作正常,但我真的不知道在我的情况下效率最高。提前致谢。
答案 0 :(得分:0)
早上好
这是我的建议
public boolean isSubstring(String str, String key) {
if(key.length() > str.length()) return false;
for(int i = 0; i <= str.length() - key.length(); i++) {
if( key.equals(str.substring(i, i + key.length())) ) return true;
}
return false;
}
public List<String> findStings(List<String> list, String key) {
List<String> newList = new ArrayList<>();
for(int i = 0; i < list.size(); i++) {
if(isSubstring(list.get(i), key)) {
newList.add(list.get(i));
}
}
return newList;
}
如果您使用的是Java 8,则可以将第二种方法的ForLoop替换为:
for(String str: list) {
if(isSubstring(str, key)) newList.add(str);
}
或简单地说:
list.stream().filter((str) -> (isSubstring(str, key))).forEach((str) -> { newList.add(str); });
答案 1 :(得分:-1)
如果你正在使用Java 8:
List<String> filteredList = myList.stream().filter(s -> s.contains("Hel")).collect(Collectors.toList());
如果您之前使用过任何内容,请使用for
每个循环:
List<String> filteredList = new ArrayList<String>();
for(String s : myList)
if(s.contains("Hel")
filteredList.add(s);