如果您需要一組user
中的所有字符串,它們在docbaseuser
中不存在,就像您使用String.equalsIgnoreCase()
一一比較但希望HashSet
或O(log n)複雜度爲TreeSet
的查找元素的複雜性要小心,不要簡單地通過使用String.toUpperCase()
或類似的方法將所有字符串轉換爲大寫或小寫字母。例如。有人可能會使用new TreeSet<>(String.CASE_INSENSITIVE_ORDER)
。
這裏是方法類似於使用String.equalsIgnoreCase()
與O(1)複雜性在建築物被用作索引的HashSet
的初始成本比較字符串的溶液。但取決於上下文,這可以保持在其他地方並保持與docuserbase
內容的更改同步。
@FunctionalInterface
private static interface CharUnaryOperator {
char applyAsChar(char operand);
}
private static String mapCharacters(String s, CharUnaryOperator mapper) {
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++)
chars[i] = mapper.applyAsChar(chars[i]);
return String.valueOf(chars);
}
private static Set<String> stringsNotPresentInOtherSetIgnoreCase(Set<String> set, Set<String> otherSet) {
Set<String> index = otherSet.stream()
.flatMap(s -> Stream.of(
mapCharacters(s, Character::toUpperCase),
mapCharacters(s, Character::toLowerCase)
))
.collect(Collectors.toCollection(HashSet::new));
return set.stream()
.filter(s -> !index.contains(mapCharacters(s, Character::toUpperCase)))
.filter(s -> !index.contains(mapCharacters(s, Character::toLowerCase)))
.collect(Collectors.toCollection(HashSet::new));
}
private static void test() {
Set<String> user = Stream.of("max", "John", "PETERSSON", "Tommy", "Strauß").collect(Collectors.toSet());
Set<String> docbaseuser = Stream.of("Max", "Petersson", "Steve", "Brad", "Strauss").collect(Collectors.toSet());
Set<String> usersNotInDocbaseuser = stringsNotPresentInOtherSetIgnoreCase(user, docbaseuser);
if (!usersNotInDocbaseuser.equals(Stream.of("John", "Tommy", "Strauß").collect(Collectors.toSet()))) {
System.out.println("Wrong result");
}
}
代碼粘貼到一些類,以確保該stringsNotPresentInOtherSetIgnoreCase()
方法適用正確調用test()
。要特別注意使用前String.toUpperCase()
轉化時被認爲相同的字符串Strauß
和Strauss
:
System.out.println("Strauß".toLowerCase().equals("strauss".toLowerCase()));
System.out.println("Strauß".toUpperCase().equals("strauss".toUpperCase()));
System.out.println("Strauß".equalsIgnoreCase("strauss"));
結果:
false
true
false
的[快捷的方式找到兩組數據之間的差異(可能的複製http://stackoverflow.com/questions/20825684/efficient-way-to-find-the-difference-between-two-data-sets) – Raedwald
不完全是'String.equalsIgnoreCase()'的重複。 @ Zeus07但是這裏真的有必要使用案例漸進式匹配嗎? –