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。
  1. 如果顺序无关紧要,您可以将 TreeSet 与自定义比较器一起使用,尽管您会松散顺序。

  2. 如果您可以从字符串数组切换到列表,您的 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,因此不会产生太多开销。