[英]How to test if a String equals any other Strings in an Array in java
我有一個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將不起作用。
您的代碼有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++;
}
請嘗試使用hashset
。
int strings = 0;
int arrayLength = x.length;
HashSet<String> unique = new HashSet<String>(Arrays.asList(x));
return unique.size();
我添加了示例代碼片段。 請嘗試這個。
嘗試這個:
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。
如果要檢查字符串是否也向后匹配,則可以使用向后的字符串創建另一個集合(backwardsSet),並且僅當backwardsSet中不存在該集合時,才將其放在另一個集合中。
如果您真的只想計算不同的字符串,則只需使用以下命令:
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(...)
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.