当前位置: 首页 > 知识库问答 >
问题:

linkedHashSet中重复项的索引

华煜祺
2023-03-14

如果包含重复元素,则返回false,在本例中,我希望知道中重复元素的索引,因为我需要在其他地方使用该索引。作为一个“链接”的集合,必须有某种方法来获取索引,但我在set/LinkedHashSetAPI中找不到任何类似的东西。

共有1个答案

柏麒
2023-03-14

LinkedHashSet本身没有显式索引。如果您需要索引,那么对此类应用程序使用通常是错误抽象和/或糟糕编程的标志。LinkedHashSet只保证可预测的迭代顺序,而不保证元素的正确索引。在这种情况下,应该使用列表,因为这是提供索引保证的接口。但是,您可以使用以下几种方法来推断索引,例如(请注意,不推荐):

a)在集合中使用索引迭代(例如。使用for循环),查找副本并在找到副本时断开;获取索引的复杂性为0(n),

Object o; // this is the object you want to add to collection
if ( !linkedHashSet.add(o) ) {
    int index = 0;
    for( Object obj : linkedHashSet ) {
        if ( obj == o ) // or obj.equals(o), depending on your code's semantics
            return index;
        index++;
    }
}

b)使用.toarray()并在数组中查找元素,例如通过

Object o; // this is the object you want to add to collection
int index;
if ( !linkedHashSet.add(o) )
    index = Arrays.asList(linkedHashSet.toArray()).indexOf(o);

这两种解决方案都将招致严重的运行时损失(第二种解决方案显然在效率方面更差,因为它在每次搜索索引时都会创建一个数组;创建一个镜像集合的并行数组会更好)。总而言之,我在你的例子中看到了一个破碎的抽象。你说

我需要在别的地方用那个索引

...如果是这样的话,那么使用set本身99%的时间都是错误的。

 类似资料:
  • 我正在尝试创建一个搜索算法,该算法将坐标对存储在一个名为HashSquaresPec的包装器类中。为了避免重复并保持插入顺序,我将每个HashSquareSpec插入到LinkedHashSet中。即使我已经重写了equals()方法和hashCode()方法,LinkedHashSet仍然接受两个具有相同坐标对的HashSquareSpec对象。 HashSquare类 和HashSquareS

  • 问题内容: 我有一个简单的问题要问,我有Product类,其中的字段如下: 我想根据ID从LinkedHasSet中删除重复项,例如,具有相同ID但数量不同的产品将被添加到集合中,我想删除(更新)具有相同ID的产品,并且它将通过我的对象的唯一ID进行操作要做到这一点? 例如,产品:id = 1,类别= CCTV,符号= TVC-DS,desc =简易摄像机,价格= 100.00, 数量= 1, 产

  • 问题内容: 我有一个包含多个重复条目的索引。它们具有不同的ID,但其他字段具有相同的内容。 例如: 删除重复项后: 有没有一种方法可以删除所有重复项并仅保留一个不同的条目,而无需手动比较所有条目? 问题答案: 我使用rails,如有必要,我将使用命令导入内容,该命令将删除并重新索引该索引和类型的所有内容……但是不确定您在哪个环境中运行ES。我只能看到的问题是数据源是否您正在从中导入(即数据库)的记

  • 我正在使用LinkedHashSet从ArrayList中获取所有唯一值。 我的代码如下所示:

  • 有什么快速的方法可以过滤列表并获得值的索引吗? 我想拿到我找到的东西的索引?

  • 问题内容: 我需要一个保持插入顺序并具有唯一值的集合。LinkedHashSet看起来很可行,但是存在一个问题- 当两个项目相等时,它将删除最新的项目(这很有意义),下面是一个示例: 该会打印: ,, 但是我需要的是: ,, 什么是最好的解决方案?是否有任何可以执行此操作的收集/收集方法,还是应该手动实现? 问题答案: 大多数Java集合都可以扩展以进行调整。 子类,重写方法。