java – Collection removeAll忽略大小写?

前端之家收集整理的这篇文章主要介绍了java – Collection removeAll忽略大小写?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
好的,这是我的问题.我必须使用HashSet,我使用removeAll方法从另一个集合中删除存在的值.

调用方法之前,我明显地将值添加到集合中.在添加之前,我在每个String上调用.toUpperCase(),因为两个列表中的值都是不同的.没有韵律或理由.

一旦我打电话给removeAll,我需要把原来的案例返回给Set中留下的值.在没有运行原始列表并使用CompareToIgnoreCase的情况下,是否有效的方法

例:

列表1:

  1. "BOB"
  2. "Joe"
  3. "john"
  4. "MARK"
  5. "dave"
  6. "Bill"

列表2:

  1. "JOE"
  2. "MARK"
  3. "DAVE"

之后,在Strings上使用toUpperCase()为每个列表创建一个单独的HashSet.然后调用removeAll.

  1. Set1.removeAll(set2);
  2.  
  3. Set1:
  4. "BOB"
  5. "JOHN"
  6. "BILL"

我需要重新列出这个列表:

  1. "BOB"
  2. "john"
  3. "Bill"

任何想法都将不胜感激.我知道它很差,应该有一个标准的原始名单,但这不是我决定.

解决方法

在我原来的答案中,我无意中建议使用比较器,但这会导致TreeSet违反 equals contract,并且是一个等待发生的错误
  1. // Don't do this:
  2. Set<String> setA = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
  3. setA.add("hello");
  4. setA.add("Hello");
  5. System.out.println(setA);
  6.  
  7. Set<String> setB = new HashSet<String>();
  8. setB.add("HELLO");
  9. // Bad code; violates symmetry requirement
  10. System.out.println(setB.equals(setA) == setA.equals(setB));

最好使用专用的类型:

  1. public final class CaselessString {
  2. private final String string;
  3. private final String normalized;
  4.  
  5. private CaselessString(String string,Locale locale) {
  6. this.string = string;
  7. normalized = string.toUpperCase(locale);
  8. }
  9.  
  10. @Override public String toString() { return string; }
  11.  
  12. @Override public int hashCode() { return normalized.hashCode(); }
  13.  
  14. @Override public boolean equals(Object obj) {
  15. if (obj instanceof CaselessString) {
  16. return ((CaselessString) obj).normalized.equals(normalized);
  17. }
  18. return false;
  19. }
  20.  
  21. public static CaselessString as(String s,Locale locale) {
  22. return new CaselessString(s,locale);
  23. }
  24.  
  25. public static CaselessString as(String s) {
  26. return as(s,Locale.ENGLISH);
  27. }
  28.  
  29. // TODO: probably best to implement CharSequence for convenience
  30. }

代码不太可能导致错误

  1. Set<CaselessString> set1 = new HashSet<CaselessString>();
  2. set1.add(CaselessString.as("Hello"));
  3. set1.add(CaselessString.as("HELLO"));
  4.  
  5. Set<CaselessString> set2 = new HashSet<CaselessString>();
  6. set2.add(CaselessString.as("hello"));
  7.  
  8. System.out.println("1: " + set1);
  9. System.out.println("2: " + set2);
  10. System.out.println("equals: " + set1.equals(set2));

不幸的是,这是更冗长的.

猜你在找的Java相关文章