在ArrayList中保存唯一字符串列表

时间:2010-02-10 08:55:11

标签: java collections arraylist

我从文本文件中读取数据,因此可能有:

John
Mary
John
Leeds

我现在需要在ArrayList中获得3个唯一元素,因为文件输出中只有3个唯一值(如上所述)。

我可以使用HashTable并向其添加信息,然后只需将其数据复制到List中。 还有其他解决方案吗?

8 个答案:

答案 0 :(得分:75)

为什么需要将其存储在List中?您是否确实需要订购数据或支持基于索引的查找?

我建议将数据存储在Set中。如果排序不重要,您应该使用HashSet。但是,如果您希望保留订购,可以使用LinkedHashSet

答案 1 :(得分:65)

如果您的List包含重复内容,并且您希望List没有重复内容,则可以执行以下操作:

List<String> newList = new ArrayList<String>(new HashSet<String>(oldList));

也就是说,将旧列表包装到一个集合中以删除重复项并再次将该集合包装在列表中。

答案 2 :(得分:17)

您可以在添加之前检查list.contains()

if(!list.contains(value)) {
    list.add(value);
}

我猜这很明显!但是,将项添加到HashSet然后从该集创建列表会更有效。

答案 3 :(得分:4)

使用set代替列表。请看这里:Java Collections Tutorials,特别是关于此处的集合:Java Sets Tutorial

简而言之,集合包含一些东西。完美:))

答案 4 :(得分:2)

以下是我解决它的方法:

import groovy.io.*;
def arr = ["5", "5", "7", "6", "7", "8", "0"]
List<String> uniqueList = new ArrayList<String>(new HashSet<String>( arr.asList() ));
System.out.println( uniqueList )

答案 5 :(得分:0)

另一种方法是使用Java 8流的独特之处

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

// public static void main(String args[]) ...

// list of strings, including some nulls and blanks as well ;)
List<String> list = Arrays.asList("John", "Mary", "John", "Leeds", 
null, "", "A", "B", "C", "D", "A", "A", "B", "C", "", null);
 
// collect distinct without duplicates
List<String> distinctElements = list.stream()
                        .distinct()
                        .collect(Collectors.toList());
 
// unique elements
System.out.println(distinctElements);

输出:

 [John, Mary, Leeds, null, , A, B, C, D]

答案 6 :(得分:0)

 List<String> distinctElements = list.stream()
            .distinct().filter(s -> s != null && s != "")
            .collect(Collectors.toList());

这将收集不同的项目,并且避免使用null或空字符串

答案 7 :(得分:-1)

class HashSetList<T extends Object>
    extends ArrayList<T> {

    private HashSet<Integer> _this = new HashSet<>();

    @Override
    public boolean add(T obj) {
        if (_this.add(obj.hashCode())) {
            super.add(obj);
            return true;
        }
        return false;
    }
}

我现在在小程序中使用这种结构,我的意思是你有很少的开销来获得getter和setter但是唯一性。此外,您可以覆盖hashCode以确定您的商品与另一商品相等。