Java:如何从 ArrayList 中删除重复的字符串数组?
Java: How to remove duplicate string array from ArrayList?
我有一个正在填充字符串数组的 ArrayList。在该过程结束时,我必须删除添加到列表中的重复字符串数组。我尝试使用 LinkedHashSet 并填充到一个新的数组列表中的常规解决方案,但在静脉中。
List<String[]> OrgList = new ArrayList<String[]>();
//String arrays added to OrgList
.....
.....
List<String[]> NewList = new ArrayList<String[]>(new LinkedHashSet<String[]>(OrgList));
在这种情况下,还有其他方法可以删除重复项吗?
提前致谢。
LinkedHashSet 不起作用,因为它是字符串 arrays,您要添加的是从 Object.
中获取的 equals。
如果顺序无关紧要,您可以将 TreeSet 与自定义比较器一起使用,尽管您会松散顺序。
如果您可以从字符串数组切换到列表,您的 LinkedHashSet 就可以工作
这应该有效
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);
您可以使用此代码
private String getArrayKey(String[] list) {
StringBuffer temp = new StringBuffer();
for (String s : list) {
temp.append(s).append("-");
}
return temp.toString();
}
然后就这样把你的List放到一个Map里。
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());
可以使用相同的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);
树集(排序)
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]);
不幸的是,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)
不会复制数组,但会在数组上创建 view,因此不会产生太多开销。
我有一个正在填充字符串数组的 ArrayList。在该过程结束时,我必须删除添加到列表中的重复字符串数组。我尝试使用 LinkedHashSet 并填充到一个新的数组列表中的常规解决方案,但在静脉中。
List<String[]> OrgList = new ArrayList<String[]>();
//String arrays added to OrgList
.....
.....
List<String[]> NewList = new ArrayList<String[]>(new LinkedHashSet<String[]>(OrgList));
在这种情况下,还有其他方法可以删除重复项吗?
提前致谢。
LinkedHashSet 不起作用,因为它是字符串 arrays,您要添加的是从 Object.
中获取的 equals。如果顺序无关紧要,您可以将 TreeSet 与自定义比较器一起使用,尽管您会松散顺序。
如果您可以从字符串数组切换到列表,您的 LinkedHashSet 就可以工作
这应该有效
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);
您可以使用此代码
private String getArrayKey(String[] list) {
StringBuffer temp = new StringBuffer();
for (String s : list) {
temp.append(s).append("-");
}
return temp.toString();
}
然后就这样把你的List放到一个Map里。
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());
可以使用相同的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);
树集(排序)
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]);
不幸的是,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)
不会复制数组,但会在数组上创建 view,因此不会产生太多开销。