说我有String x= "algorithm"
和String y= "mgth"
字符串x
包含字符串y
中的所有字母,我可以将字符串y
拆分为一个字母列表,然后遍历此列表以查看字符串x
是否包含字母y[index]
,
但我想知道是否有更有效的方法
编辑:
在Kotlin中有一个简单的相交函数,例如:
val x="algorithm".toList()
val y="mgth".toList()
val interesct=x.intersect(y) //returns a Set of matching chars
if (y.size == interesct.size){
println("match")
}
答案 0 :(得分:1)
使用Set
是一种更有效的方法。
String x = "algorithm";
String y = "mgth";
Set<Character> set = new HashSet<>();
for(char c: y.toCharArray())
set.add(c);
for(char c: x.toCharArray())
set.remove(c);
if(set.size() == 0)
System.out.println("X contains Y");
else
System.out.println("X does not contain Y");
以上代码的作用是将较小的String
中的字符添加到集合中。然后,它删除较大的String
中的每个字符。
如果Set
中有任何剩余字符,则表示较小的String
包含的字母不在较大的String
中。
答案 1 :(得分:1)
用于救援的正则表达式:
String pattern = "mgth".chars()
.mapToObj(ch -> "(?=.*" + (char) ch + ")")
.collect(Collectors.joining());
// ".*(?=.*m)(?=.*g)(?=.*t)(?=.*h).*"
boolean matches = Pattern.compile(".*"+pattern+".*")
.matcher("algorithm")
.matches();
System.out.println(matches);
仅当"algorithm"
包含目标字符串生成的模式中的所有字符时,此匹配。
编辑
此外,您可以对两个字符串进行排序,并且仅在[min("mgth"), max("mgth")]
个char值的间隔中执行比较。
答案 2 :(得分:1)
尝试这个
@Test
public void similarity() {
String x = "algorithm";
String y = "mgth";
final boolean ohYes =
y.chars().filter(yc -> x.chars().anyMatch(xc -> yc == xc)).count() == y.length();
Assert.assertTrue(ohYes);
}