我有一个ArrayList并添加我要检查的字符串。
ArrayList<String> al = new ArrayList<String>();
al.add("is");
al.add("the");
然后我有一个方法返回在String中找到的匹配,该匹配也在ArrayList中。
public static String getWord(String str1, ArrayList<String> list)
{
for(int i = 0; i < list.size(); i++)
{
if(str1.toLowerCase().contains(list.get(i)))
{
return list.get(i);
}
}
return false;
}
虽然当我想检查一个有多个匹配的String时,它只返回添加到ArrayList中的第一个,所以
al.add("is");
al.add("the");
它将返回&#34;是&#34;
如果我像这样添加它们
al.add("the");
al.add("is");
它将返回&#34;&#34;
我需要一种方法来确定有多少匹配并单独返回。
答案 0 :(得分:1)
尝试使用Map来保持,键作为List中的字符串,值将是计数匹配
public static void main(String[] args) throws Exception
{
List<String> list = new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("ee");
list.add("ff");
list.add("kk");
list.add("ff");
System.out.println(getWord("aabbccddeeff", list));
}
public static Map<String, Integer> getWord(String str1, List<String> list)
{
Map<String, Integer> map = new HashMap<String, Integer>();
Integer count = 1;
for (String match : list)
{
if(str1.toLowerCase().contains(match))
{
if(map.containsKey(match))
{
count = map.get(match);
count++;
}
map.put(match, count);
}
}
return map;
}
答案 1 :(得分:0)
尝试使用其他数组列表来保存匹配
ArrayList<String> al = new ArrayList<String>();
al.add("is");
al.add("the");
//...
ArrayList<String> result = getWord("something", a1);
// return matches individually with indexes or use indexOf...
result.get(1);
result.get(result.indexOf("something random"));
// how many matches = size of the array list
result.size();
// ...
public static ArrayList<String> getWord(String str1, ArrayList<String> list)
{
ArrayList<String> matches = new ArrayList<String>();
String testString = str1.toLowerCase();
for(int i = 0; i < list.size(); i++)
{
if(testString.contains(list.get(i)))
{
matches.add(list.get(i));
}
}
return matches;
}
希望这有帮助。
答案 2 :(得分:0)
O(nm)
解决方案:如果您的字符串长度为m
且列表长度为n
,则您在原始问题中显示的算法会以O(mn)
时间复杂度运行,因为它必须遍历整个列表O(n)
然后搜索整个字符串O(m)
。
O(n+m)
解决方案:但是,你可以做得更好如果首先可以将字符串分成单个单词(例如"The dog jumped"
会给["The", "dog", "jumped"]
)。在这种情况下,您可以将O(m + n)
的运行时间首先分离为存储在HashSet<String>
中的单个单词,然后在列表中搜索每个单词。
E.g。
Set<String> getWords(String str, Set<String> words){ // using set removes dups
Set<String> indvWords = getIndividualWords(str); // O(m)
Set<String> matchedWords = new HashSet<String>(); // O(1)
for(String word : words) // O(n)
if(indvWords.contains(word)) // O(1)
matchedWords.add(word); // O(1)
return matchedWords;
} // total: O(m + n)
当然,您必须自己实施Set<String> getIndividualWords(String str)
,可能使用String#split(String)
regex
pattern,例如:
Set<String> getIndividualWords(String str){
return new HashSet<String>(str.split("\\W")); // split string by non words
}
答案 3 :(得分:-1)
public static void getWord(String str1, ArrayList<String> list)
{
for(int i = 0; i < list.size(); i++)
{
if(str1.toLowerCase().contains(list.get(i)))
{
System.out.println(list.get(i));
}
}
}