3

我正在尝试从具有以下格式的类列表中提取唯一元素:

[EntityClientPlayerMP['Player989'/228, l='MpServer', x=138.16, y=68.62, z=522.96], EntityCow['Cow'/231, l='MpServer', x=143.63, y=68.00, z=527.50]....]

这些列表的大小通常为 60-100。

我目前尝试使用的方法是

List<Class> uniqueList = new ArrayList<Class>(new HashSet<Class>(fullList));

这将返回完全相同的列表,但排序略有不同。关于为什么的任何想法?

4

3 回答 3

3

它们的排序不同,因为HashSet基于对象的 hashCode 具有“奇怪”的排序。要保持排序,请使用LinkedHashSet.

至于唯一性, Set 将使用equals()and hashCode(),因此请确保正确实施。有时有效的一种惰性技术是使用toString()对象的方法(并在字符串上调用 hashCode 和 equals)。

于 2013-05-29T21:57:07.007 回答
2

不要忘记覆盖每个实体类中的equals()and方法(为什么?),否则集合将无法正确确定两个元素何时相等。另外,我认为您的意思是:hashCode()

List<EntityClientPlayerMP> uniqueList =
    new ArrayList<EntityClientPlayerMP>(
        new LinkedHashSet<EntityClientPlayerMP>(fullList));

现在在上面的代码片段中,类型参数是一个特定的(不是Class问题中显示的,根据需要替换为实际类型),并且通过使用LinkedHashSet我们保证原始列表中的顺序被保留。

于 2013-05-29T21:56:59.180 回答
2

您需要为equals()hashcode()

于 2013-05-29T21:54:50.780 回答