Java:如何从ArrayList中删除重复的字符串数组?

时间:2015-01-06 12:43:13

标签: java arraylist duplicates

我有一个ArrayList,它正在填充字符串数组。在进程结束时,我必须删除添加到列表中的重复字符串数组。我尝试使用LinkedHashSet的常规解决方案并填充到新的数组列表中,但仍然是静脉。

List<String[]> OrgList = new ArrayList<String[]>();
//String arrays added to OrgList 
.....
.....
List<String[]> NewList = new ArrayList<String[]>(new LinkedHashSet<String[]>(OrgList));

在这种情况下还有其他方法可以删除重复项吗?

先谢谢。

6 个答案:

答案 0 :(得分:0)

LinkedHashSet无法正常工作,因为它正在添加的是数组,其中equals来自Object。

  1. 如果顺序无关紧要,您可以将TreeSet与自定义Comparator一起使用,尽管您将失去订单。

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