如何测试String是否等于java中数组中的任何其他字符串

时间:2015-10-24 20:20:00

标签: java arrays string

我有一个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将无法正常工作。

5 个答案:

答案 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(...))。