如何在Java中创建唯一/不同对象(没有重复)的列表?
现在我正在使用HashMap<String, Integer>
这样做,因为密钥被覆盖,因此最后我们可以得到HashMap.getKeySet()
,这将是独一无二的。但我确信应该有更好的方法来实现这一点,因为这里浪费了价值部分。
您可以使用Set实现:
来自JAVADoc的一些信息:
不包含重复元素的集合。更正式地说,集合不包含元素对e1和e2,使得e1.equals(e2)和至多一个null元素。正如其名称所暗示的,该界面模拟数学集抽象。
注意:如果将可变对象用作set元素,则必须非常小心。如果在对象是集合中的元素的同时以影响等于比较的方式更改对象的值,则不指定集合的行为。这种禁令的一个特例是,不允许将一个集合作为一个元素包含在内
这些是实现:
HashSet
时,生成元素的顺序是不确定的。 Set<Integer> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add(3);
linkedHashSet.add(1);
linkedHashSet.add(2);
for (int i : linkedHashSet) {
System.out.println(i);
}
......必将是
3
1
2
Set<Integer> treeSet = new TreeSet<>();
treeSet.add(3);
treeSet.add(1);
treeSet.add(2);
for (int i : treeSet) {
System.out.println(i);
}
...将输出:
1
2
3
(您还可以将Comparator
实例传递给TreeSet
构造函数,使其按不同顺序对元素进行排序。)
请注意,如果要正确实现Set接口,则由set维护的排序(无论是否提供显式比较器)必须与equals一致。 (有关与equals一致的精确定义,请参阅Comparable或Comparator。)这是因为Set接口是根据equals操作定义的,但TreeSet实例使用compareTo(或compare)方法执行所有元素比较,因此从集合的角度来看,通过这种方法被认为相等的元素是相等的。集合的行为即使其排序与equals不一致也是明确定义的;它只是不遵守Set接口的一般合同。我想澄清其他人提到的原始海报的一些内容,但没有明确说明。当你说你想要一个唯一列表时,这就是有序集的定义。 Set Interface和List接口之间的一些其他关键差异是List允许您指定插入索引。那么,问题是你真的需要List接口(即与第三方库的兼容性等),还是你可以重新设计你的软件以使用Set接口?您还必须考虑使用界面执行的操作。按指数查找元素是否重要?你在集合中有多少元素?如果你有很多元素,订购重要吗?
如果您确实需要一个只有唯一约束的List,那么Apache Common Utils类org.apache.commons.collections.list.SetUniqueList将为您提供List接口和唯一约束。请注意,这会打破List接口。但是,如果您需要通过索引查找列表,您将从中获得更好的性能。如果你可以处理Set接口,并且你有一个较小的数据集,那么LinkedHashSet可能是一个很好的方法。它只取决于您的软件的设计和意图。
同样,每个集合都有一些优点和缺点。一些快速插入但读取速度慢,一些具有快速读取但插入速度慢等。使用集合文档花费大量时间来充分了解每个类和接口的更精细细节是有意义的。
使用new HashSet<String>
一个例子:
import java.util.HashSet;
import java.util.Set;
public class MainClass {
public static void main(String args[]) {
String[] name1 = { "Amy", "Jose", "Jeremy", "Alice", "Patrick" };
String[] name2 = { "Alan", "Amy", "Jeremy", "Helen", "Alexi" };
String[] name3 = { "Adel", "Aaron", "Amy", "James", "Alice" };
Set<String> letter = new HashSet<String>();
for (int i = 0; i < name1.length; i++)
letter.add(name1[i]);
for (int j = 0; j < name2.length; j++)
letter.add(name2[j]);
for (int k = 0; k < name3.length; k++)
letter.add(name3[k]);
System.out.println(letter.size() + " letters must be sent to: " + letter);
}
}
您可以使用HashSet<String>
来维护一组唯一对象。如果地图中的Integer
值很重要,那么您可以使用containsKey
地图方法来测试您的密钥是否已经在地图中。
HashSet<String>
(或)任何Set
实施可能为您完成这项工作。 Set
不允许重复。
这是HazSet的javadoc。
我不知道这是多么有效,但在一个简单的背景下对我有用。
List<int> uniqueNumbers = new ArrayList<>();
public void AddNumberToList(int num)
{
if(!uniqueNumbers .contains(num)) {
uniqueNumbers .add(num);
}
}
您可能想要使用java.util.Set<E>
接口的实现类之一,例如java.util.HashSet<String>
收藏班。
不包含重复元素的集合。更正式地说,集合不包含元素对e1和e2,使得e1.equals(e2)和至多一个null元素。正如其名称所暗示的,该界面模拟数学集抽象。