检查每个字符串是否存在于另一个字符串中,但顺序



我想比较两个字符串(str1str2)以了解我的str2的所有元素是否都包含在str1中。

更具体地说,请看以下示例:

我有:

str1="1,3"
str2= "1,2,3,5"
if(str2.contains(str1)
System.out.print("YES");
else 
System.out.print("NO");

我的控制台显示"否"。但是,13存在于str2中。您知道如何知道我的str1的每个元素是否存在于我的str2中,但是顺序?

我们可以尝试将两个 CSV 字符串转换为集合,然后使用Set#containsAll检查一个集合是否包含另一个集合:

Set<String> set1 = new HashSet<>(Arrays.asList(str1.split(",")));
Set<String> set2 = new HashSet<>(Arrays.asList(str2.split(",")));
if (set2.containsAll(set1)) {
System.out.print("YES");
}
else {
System.out.print("NO");
}

这里有两种一般情况:

  1. 你不在乎重复项。这意味着1,2,3,4确实包含1,3,3.
  2. 确实关心重复项。这意味着1,3,4,5包含1,4,但不包含1,1,4

鉴于

String str1 = "1,3,3";
String str2 = "1,2,3,4,5";

对于第一种情况。

您所要做的就是制作两个Set,并询问"较大"集合是否containsAll"较小"集合中的元素:

Set<String> dict = Set.of(str2.split(","));
Set<String> input = Set.of(str1.split(","));
if (dict.containsAll(input)) {
print("Contains");
}
else {
print("Doesn't contain");
}

对于第二种情况

您也可以使用集合,但您还需要知道每个元素的基数。这意味着你想要一个Map

Map<String, Long> elementCardinality(String[] input) {
return Arrays.stream(input)
.collect(Collectors.groupingBy(
Function.identity(),
Collectors.counting()));
}

然后对于你的两个字符串:

Map<String, Long> dict  = elementCardinality(str2.split(","));
Map<String, Long> input = elementCardinality(str1.split(","));
boolean containsAll = true;
for (Map.Entry<String,Long> entry : input.entrySet()) {
Long dictCardinality = dict.getOrDefault(entry.getKey(), 0L);
if (!dictCardinality.equals(entry.getValue())) {
containsAll = false;
break;
}
}
if (containsAll) {
print("Contains");
}
else {
print("Doesn't contain");
}

S1="1,3"是字符串,字符串中没有元素。

if(str2.contains(str1)) 暗示如果 "1,3" 存在于 S2 中,即 "1,2,3,5",因此它不会返回 false。我匹配完整的字符串而不是字符串的字符

您可以将字符串转换为字符/整数列表,并检查该列表中的所有元素是否都存在于字符串 S2 中。

法典:

String s1 = "1,2";
String s2 = "1,2,3,4";
String s3 = "1,5";
List<String> s1List = new ArrayList<>(Arrays.asList(s1.split(",")));
List<String> s2List = new ArrayList<>(Arrays.asList(s2.split(",")));
System.out.println(s1List);
if(s1List.stream().allMatch(s2List::contains))
System.out.print("YES");
else
System.out.print("NO");
List<String> s3List = new ArrayList<>(Arrays.asList(s3.split(",")));
System.out.println(s3List);
if(s3List.stream().allMatch(s2List::contains))
System.out.print("YES");
else
System.out.print("NO");

输出:

[1, 2]
YES
[1, 5]
NO

相关内容

  • 没有找到相关文章

最新更新