从java中的Arraylist中的列表中删除重复项

时间:2015-12-10 12:47:59

标签: java arraylist duplicates hashset

我查了很多例子,但我无法申请我的变数。 我有一个字符串列表的ArratyList。

ArrayList<List<String>> bulkUploadList = new ArrayList<List<String>>();

它看起来像这样:

[id,title,tags,description]

[4291483113.0000000000000, Camden, camdentown;london, NoValue]
[4292220054.0000000000000, IMG_2720, NoValue, NoValue]
[4292223824.0000000000000, IMG_2917, london;camdentown, NoValue]
[4292224728.0000000000000, IMG_2945, London;CamdenTown, NoValue]

我想删除那些具有相同标题和相同标签的行。 我不知道如何使用HashSet,因为我有一个字符串列表的ArrayList。

2 个答案:

答案 0 :(得分:1)

不是最佳解决方案,但您可以从这开始:

    ArrayList<List<String>> bulkUploadList = new ArrayList<List<String>>();
    ArrayList<List<String>> result = new ArrayList<List<String>>();

    HashSet<String> hashSet = new HashSet<>();

    for(List<String> item : bulkUploadList) {
        String title = item.get(1);
        String tags = item.get(2);
        String uniqueString = (title + "#" + tags).trim().toUpperCase();

        if(!hashSet.contains(uniqueString)) {
            result.add(item);
            hashSet.add(uniqueString);
        } else {
            System.out.println("Filtered element " + uniqueString);
        }
    }

答案 1 :(得分:0)

正如其中一条评论中所建议的,您应该为数据创建一个类,使该类实现equals(),然后使用HashSet删除重复项。像这样。

class Foo {
String id;
String title;
String tags;
String description;

public boolean equals(Foo this, Foo other) {
   return this.id.equals(other.id) 
      && this.title.equals(other.title)
      && etc.
}

然后您可以使用

删除重复项
 Set<Foo> set = new LinkedHashSet<Foo>(list);

as Sets不允许复制,并使用equals()方法进行检查。

您应该在此处使用linkedHashSet,因为您希望保留订单(根据您在其他地方发表的评论)。

您还应该实现与equals()一致的hashcode()方法。