我有一个String数组,我想看看这个数组中有多少个不同的字符串。意味着有多少个字符串,不包括重复的字符串。这就是我所拥有的:
int strings = 0;
int arrayLength = x.length;
for (int currentNum = 1; currentNum < arrayLength; currentNum++) {
for (int i = currentNum + 1; i < arrayLength; i++) {
if (x[currentNum].equals(x[i])) {
break;
} else {
strings++;
}
}
return strings;
}
但这永远不会返回正确的金额,有人可以告诉我为什么吗?
更新:
出于好奇,如果我还想检查字符串是否与其他字符串相反?然后HashSets将无法正常工作。
答案 0 :(得分:4)
您的代码有2个问题。首先,数组索引从0
开始,而不是1
。其次,当您想要跳过该行时,break
会将您带到行strings++
。相反,您希望continue
外部循环,以便不执行行strings++
。令人讨厌的是,你不能单独使用continue
因为这适用于内部循环。您可以使用标签,如下所示:
loop:
for (int currentNum = 0; currentNum < arrayLength; currentNum++) {
for (int i = currentNum + 1; i < arrayLength; i++) {
if (x[currentNum].equals(x[i])) {
continue loop;
}
}
strings++;
}
答案 1 :(得分:1)
请尝试使用hashset
。
int strings = 0;
int arrayLength = x.length;
HashSet<String> unique = new HashSet<String>(Arrays.asList(x));
return unique.size();
我添加了示例代码段。请试试这个。
答案 2 :(得分:1)
试试这个:
int strings = 0;
int arrayLength = x.length;
for (int currentNum = 0; currentNum < arrayLength; currentNum++) {
++strings;
for (int i = 0; i < arrayLength; i++) {
if (i != currentNum && x[currentNum].equals(x[i])) {
--strings;
break;
}
}
}
return strings;
这样你为当前字符串添加1,然后检查所有其他字符串(不包括他自己),如果找到你,则减去1。
答案 3 :(得分:1)
如果你想检查字符串是否也向后匹配,你可以创建另一个带有向后字符串的集合(backwardsSet),只有当它在backwardsSet中不存在时才将它放在另一个集合中。
答案 4 :(得分:0)
如果你真的只想计算不同的字符串,那么只需使用它:
Arrays.stream(strings).distinct().count()
如果你想忽略回文:
final String[] strings = { "ab", "ba", "ab", "cd" };
// I assume a and b are not null
final BiPredicate<String, String> equal =
(a, b) -> a.equals(b) || new StringBuilder(a).reverse().toString().equals(b);
final Set<String> set = new HashSet<>();
for (final String s1 : strings)
if (!set.stream().anyMatch(s2 -> equal.test(s1, s2)))
set.add(s1);
System.out.println(set.size());
如果你需要处理很多字符串,你可以优化它。不同长度的字符串不能相等。你可以创建一个分区,你有相同大小的字符串子集。然后处理这些子集(参见Collectors.groupBy(...)
)。