【问题标题】:How to tell java's TreeSet or HashMap that the order by which its contenst are indexed is the insertion order(don't want LinkedHashMap)?如何告诉 java TreeSet 和 HashMap 其内容的索引顺序是插入顺序(不想要 LinkedHashMap)?
【发布时间】:2018-04-25 15:54:37
【问题描述】:

例如;我希望我的 TreeSet / HashMap 按该顺序存储 1,19,3,4,2,0,因为这是它们添加到地图的顺序。

我听说 LinkedHashMap 是首选解决方案。但我的问题是,我们可以用 TreeSet/HashMap 产生相同的结果,并在 compareTo() 中引入一些修改吗?

【问题讨论】:

  • 我认为这就是 LinkedHashMap 的用途
  • 我如何告诉我的狗他是一只猫?
  • 创建一个模拟实际实现的替代实现有什么好处?
  • 我没有看到创建一个全新的实现的好处,但如果可以通过一些修改(如 return 1 或 - 1 或其他),那么这是一件好事。
  • LinkedHashMap 已经存在并且完全满足您的要求时,您为什么还要尝试破解另一个Map 实现?

标签: java dictionary hashmap


【解决方案1】:

没有。你不能这样做。您必须使用LinkedHashMap 或其他自定义地图实现; TreeMapHashMap 不支持插入顺序。

【讨论】:

  • 我想也许在 compareTo() 中有一些巧妙的编码......谢谢!
  • 没有什么能让地图真正可用。
  • 他说的是TreeSet或者HashMap。 TreeSet 仍然可以完美使用。我可以想到一个用例,其中 TreeMap(而不是 HashMap)的插入顺序会很有用:如果您使用时间戳作为键以便将查询结果范围限定为 NavigableMap,那么插入顺序将作为副产品保留.
【解决方案2】:

您可以使用非常复杂的 compareTo(...) 方法来实现,但它基本上需要自己手动跟踪树的状态,在树的外部某处。这只是在不使用 LinkedHashMap 的情况下重新创建 LinkedHashMap。同样的事情,但更复杂,更难阅读和维护代码。没有理由这样做。

【讨论】:

  • 我能想到的最简单的方法是,在添加到地图的函数中,会有一个变量来跟踪no。到目前为止添加到该映射的元素,并将该值分配给每个实例的变量(例如,int myindex)。然后 compareTo 应该工作。但这既不便携也不可行。
  • 哈!你打了我一拳。是的,用户可以调用 mySet.remove() 的事实使得简单的整数插入顺序有问题。您可能需要为 insertOrder 对象使用日期/时间戳。
【解决方案3】:

“你不能那样做。”嗯,你可以。您需要做的就是将插入顺序添加到您正在存储的对象中,并在 compareTo 或比较器中说明它。

@Override
public int compareTo(Object o) {
    int returnValue = 0;
    if(o instanceof InsertionObject) {
        InsertionObject newObject = (InsertionObject)o;
        if(this.insertionOrder != newObject.insertionOrder) {
            if(this.insertionOrder < newObject.insertionOrder) {
                returnValue = -1;
            }
            else {
                returnValue = 1;
            }
        }
    }
    else {
        throw new RuntimeException("Insert error message here.");
    }
    return returnValue;
}

我不是说你应该,但你可以。这闻起来像面试问题或家庭作业问题,所以他们可能只是在测试是否发帖人了解底层集合内部发生了什么?

【讨论】:

  • 这仅适用于自定义类型,并且使地图基本上无法用于查询。
  • 我特别想到了 TreeSet,但是是的。没有任何逻辑理由你会这样做。这就是为什么我假设这是一个面试问题,旨在测试某人对底层结构的理解。
猜你喜欢
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 2016-10-11
相关资源
最近更新 更多