我想比较两个字符串(str1
和str2
)以了解我的str2
的所有元素是否都包含在str1
中。
更具体地说,请看以下示例:
我有:
str1="1,3"
str2= "1,2,3,5"
if(str2.contains(str1)
System.out.print("YES");
else
System.out.print("NO");
我的控制台显示"否"。但是,1和3存在于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,2,3,4
确实包含1,3,3
. - 你确实关心重复项。这意味着
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