最干净的解决方案是@SQLHacks 建议的解决方案。但后来你说ABC:123a4 必须不同于abc:1234A4。我想现在唯一的解决方案是为 String 对象创建一个包装器并覆盖 equals() 和 hashCode() 方法来做你想做的事,正如@PaulBoddington 在他的评论中所建议的那样。
这是我想出的(根据@nafas 的回答进行了编辑和改进):
public class StringWrapper {
private String value;
private String beforeColon;
private String afterColon;
private int hash;
public StringWrapper(String value) {
this.value = value;
String[] splitted = value.split(":");
beforeColon = splitted[0];
afterColon = splitted[1];
hash = Objects.hash(beforeColon.toUpperCase(), afterColon);
}
public String getValue() {
return value;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof StringWrapper) {
StringWrapper other = (StringWrapper) obj;
return beforeColon.equalsIgnoreCase(other.beforeColon) && afterColon.equals(other.afterColon);
}
return false;
}
@Override
public int hashCode() {
return hash;
}
@Override
public String toString() {
return value;
}
}
然后:
// this method is just to help you building a List<StringWrapper> from your String (memberList variable)
public static List<StringWrapper> split(String string, String regex) {
List<StringWrapper> list = new ArrayList<>();
for (String element : string.split(regex)) {
list.add(new StringWrapper(element));
}
return list;
}
public static void main(String[] args) {
String memberList = "ABC:123,abc:123,ABC:123a4,ABC:123A4";
List<StringWrapper> memlist = new ArrayList<>(split(memberList, ","));
Set<StringWrapper> memberSet = new HashSet<>(memlist);
memlist = new ArrayList<StringWrapper>(memberSet);
for (StringWrapper element : memlist) {
System.out.println(element);
}
}
如果你运行它,你会得到以下输出:
ABC:123a4
ABC:123A4
ABC:123
abc:123 不在,但 ABC:123a4 和 ABC:123A4 都在。
您可以更轻松地更改静态split 方法来为您创建Set。我没有这样做的原因是为了让你看起来很熟悉。