我有一个ArrayList,它正在填充字符串数组。在进程结束时,我必须删除添加到列表中的重复字符串数组。我尝试使用LinkedHashSet的常规解决方案并填充到新的数组列表中,但仍然是静脉。
List<String[]> OrgList = new ArrayList<String[]>();
//String arrays added to OrgList
.....
.....
List<String[]> NewList = new ArrayList<String[]>(new LinkedHashSet<String[]>(OrgList));
在这种情况下还有其他方法可以删除重复项吗?
先谢谢。
答案 0 :(得分:0)
LinkedHashSet无法正常工作,因为它正在添加的是数组,其中equals来自Object。
如果顺序无关紧要,您可以将TreeSet与自定义Comparator一起使用,尽管您将失去订单。
如果您可以从字符串数组切换到列表,您的LinkedHashSet可以正常工作
答案 1 :(得分:0)
这应该有效
TreeSet<String[]> set = new TreeSet<String[]>(new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
return Arrays.equals(o1, o2) ? 0 : 1;
}});
set.addAll(list);
答案 2 :(得分:0)
您可以使用此代码
private String getArrayKey(String[] list) {
StringBuffer temp = new StringBuffer();
for (String s : list) {
temp.append(s).append("-");
}
return temp.toString();
}
然后以这种方式将您的列表放入地图。
Map<String , String []> map = new HashMap<String, String[]>();
for (String[] strings : OrgList ) {
map.put(getArrayKey(strings), strings);
}
最后回复你的清单
List<String[]> NewList = new ArrayList<String[]>();
NewList.addAll(map.values());
答案 3 :(得分:0)
相同的TreeSet只能用于比较需要更改为Arrays.equal不支持String []。
TreeSet<String[]> set = new TreeSet<String[]>(new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
return Arrays.asList(o1).containsAll(Arrays.asList(o2))?0:1;
}});
set.addAll(origList);
答案 4 :(得分:0)
TreeSet的(排序)
String[] array = new TreeSet<String>(Arrays.asList(str)).toArray(new String[0]);
或 HashSet(更快,没有排序)
String[] array = new HashSet<String>(Arrays.asList(str)).toArray(new String[0]);
答案 5 :(得分:0)
不幸的是,Java 8 Stream API中没有distinctBy
,但在这种情况下只需使用Arrays.asList(array)
就可以获得所需的内容:
List<String[]> list = new ArrayList<String[]>();
//...
List<String[]> result =
list.stream()
.map(s -> Arrays.asList(s))
.distinct()
.collect(Collectors.toList());
它运作的原因是List
实施should实施equals
比较内容,因此Stream.distinct()
将与列表一起使用。
Arrays.asList(array)
不会复制arrray,但会在阵列上创建 view ,因此不会产生太多开销。