加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Collection removeAll忽略大小写?

发布时间:2020-12-14 16:26:02 所属栏目:Java 来源:网络整理
导读:好的,这是我的问题.我必须使用HashSet,我使用removeAll方法从另一个集合中删除存在的值. 在调用该方法之前,我明显地将值添加到集合中.在添加之前,我在每个String上调用.toUpperCase(),因为两个列表中的值都是不同的.没有韵律或理由. 一旦我打电话给removeAll
好的,这是我的问题.我必须使用HashSet,我使用removeAll方法从另一个集合中删除存在的值.

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

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

例:

列表1:

"BOB"
"Joe"
"john"
"MARK"
"dave"
"Bill"

列表2:

"JOE"
"MARK"
"DAVE"

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

Set1.removeAll(set2);

Set1:
    "BOB"
    "JOHN"
    "BILL"

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

"BOB"
"john"
"Bill"

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

解决方法

在我原来的答案中,我无意中建议使用比较器,但这会导致TreeSet违反 equals contract,并且是一个等待发生的错误:
// Don't do this:
Set<String> setA = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
setA.add("hello");
setA.add("Hello");
System.out.println(setA);

Set<String> setB = new HashSet<String>();
setB.add("HELLO");
// Bad code; violates symmetry requirement
System.out.println(setB.equals(setA) == setA.equals(setB));

最好使用专用的类型:

public final class CaselessString {
  private final String string;
  private final String normalized;

  private CaselessString(String string,Locale locale) {
    this.string = string;
    normalized = string.toUpperCase(locale);
  }

  @Override public String toString() { return string; }

  @Override public int hashCode() { return normalized.hashCode(); }

  @Override public boolean equals(Object obj) {
    if (obj instanceof CaselessString) {
      return ((CaselessString) obj).normalized.equals(normalized);
    }
    return false;
  }

  public static CaselessString as(String s,Locale locale) {
    return new CaselessString(s,locale);
  }

  public static CaselessString as(String s) {
    return as(s,Locale.ENGLISH);
  }

  // TODO: probably best to implement CharSequence for convenience
}

此代码不太可能导致错误:

Set<CaselessString> set1 = new HashSet<CaselessString>();
set1.add(CaselessString.as("Hello"));
set1.add(CaselessString.as("HELLO"));

Set<CaselessString> set2 = new HashSet<CaselessString>();
set2.add(CaselessString.as("hello"));

System.out.println("1: " + set1);
System.out.println("2: " + set2);
System.out.println("equals: " + set1.equals(set2));

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读