我有一组字符串数组,我想从这里删除重复的元素...
String[] arr1 = {"a1","b1"};
String[] arr2 = {"a2","b2"};
Set<String[]> mySet = new HashSet<String[]>();
mySet.add(arr1);
mySet.add(arr2);
mySet.add(new String[] {"a1","b1"});
System.out.print(mySet.size());
Run Code Online (Sandbox Code Playgroud)
目前mySet看起来像这样:
[{"a1","b1"},{"a2","b2"},{"a1","b1"}]
Run Code Online (Sandbox Code Playgroud)
但我想这样:
[{"a1","b1"},{"a2","b2"}]
Run Code Online (Sandbox Code Playgroud)
我知道一些方法......
c.P*_*.u1 11
数组继承自Object,不会覆盖hashCode和equals方法.A HashSet使用Map实现,而实现又使用hashCode并equals避免重复元素.
您可以使用TreeSet自定义Comparator来比较String数组是否相等.
Set<String[]> mySet = new TreeSet<>(new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
return Arrays.equals(o1, o2)? 0 : Arrays.hashCode(o1) - Arrays.hashCode(o2);
}
});
Run Code Online (Sandbox Code Playgroud)
请注意,这只会忽略具有相同对应元素的重复数组.如果元素的顺序不同,则不会将其视为重复.
如果您希望能够丢弃无序重复项,例如,{a1, b1}和{b1, a1},请使用:
@Override
public int compare(String[] o1, String[] o2) {
int comparedHash = o1.hashCode() - o2.hashCode();
if(o1.length != o2.length) return comparedHash;
List<String> list = Arrays.asList(o1);
for(String s : o2) {
if(!list.contains(s)) return comparedHash;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
bco*_*rso 10
所述array散列码是独立的的内容array(它继承的Object哈希码,它使用阵列的参照).
但是,List会做你想要的.它使用基于中的元素的哈希码List.来自Java Docs:
int hashCode = 1;
for (E e : list)
hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
Run Code Online (Sandbox Code Playgroud)
例:
List<String> list1 = Arrays.asList("a1","b1");
List<String> list2 = Arrays.asList("a2","b2");
Set<List<String>> mySet = new HashSet<List<String>>();
mySet.add(list1);
mySet.add(list2);
mySet.add(Arrays.asList("a1","b1")); // duplicate won't be added
System.out.print(mySet.size()); // size = 2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32775 次 |
| 最近记录: |