Java 获取唯一列表元素时遇到问题

Java 获取唯一列表元素时遇到问题,java,arraylist,Java,Arraylist,我正在尝试从具有以下格式的类列表中提取唯一元素: [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 ArrayLis

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

[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));
List uniqueList=newarraylist(newhashset(fullList));

这将返回完全相同的列表,但排序略有不同。想知道为什么吗?

您需要为
equals()
hashcode()

提供正确的实现,不要忘记覆盖每个实体类()中的和方法,否则集合将无法正确确定两个元素何时相等。还有,我想你的意思是:

List<EntityClientPlayerMP> uniqueList =
    new ArrayList<EntityClientPlayerMP>(
        new LinkedHashSet<EntityClientPlayerMP>(fullList));
列表唯一列表=
新阵列列表(
新LinkedHashSet(完整列表));

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

它们的顺序不同,因为
HashSet
具有“奇怪”的顺序,基于对象的哈希代码。要保留顺序,请使用
LinkedHashSet


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

什么是“排序有点不同”?你能举个例子吗?你的
类是什么样的?(我想你不是说
java.lang.Class
?)这听起来很像“我没有实现hashCode()和equals()”的问题。排序对我来说不是问题,我不明白为什么它会返回一个排序的版本,而不仅仅是唯一的元素,就像它在列表上做了一个排序但不删除重复项的操作一样。其他评论显示,我对实现hashcodes知之甚少,因此我在下面的评论中解释了类的用法。示例列表不仅包括
EntityClientPlayerMP
,还包括
EntityCow
。大概这些是OP的
类的子类型
类型。@如果是这样的话,您可能需要Object。我的意思是,OP显然定义了自己的类型
,其中
EntityClientPlayerMP
EntityCow
是子类型。当然,这只是空泛的猜测,与这个问题几乎没有关系(对于你的答案,我没有什么要补充的)。很可能OP使用了
Class
作为例子,是真实类的占位符,所以让我们忽略这一点,把重点放在我实际上是指类的问题上,由于此列表在游戏minecraft的mod中用于按类搜索敌人,因此代码中的内置方法要求将类作为参数。作为一个相当新的程序员,我不确定这是否正确,但它以我预期的方式工作。上课不是个好主意吗?我试图在这篇评论中发布这个方法,但是没有足够的空间,最好的方式是什么?