【问题标题】:Navigable Map - Sorted Map yet un-orderedNavigable Map - 已排序的地图但未排序
【发布时间】:2020-10-08 10:47:01
【问题描述】:
  • 大家好,请帮忙,我今天发现了 NavigableMap,最初它对我有用,直到我执行以下操作。
  • 当我填充 NavigableMap 时,请注意从字符串值的末尾开始,我添加了值 1-4,然后是 5。
  • 字符串布局例如是“23816012269”,最后一个值 使它独一无二,因为我稍后在代码中使用它。
  • 直到 4 的所有值都是重复的 (23816012269) ,然后 23806012269 是一个以不同字符串/数字为前缀的新值,我将继续使用新的重复值(以下一个序列 数字为后缀等)。
  • 问题是,当我按照您在下面看到的顺序填充 NavigableMap 时,它会将 ("238060122695",...) 放在 NavigableMap 的第一个条目中,即使它是最后添加到 NavigableMap 中的。
  • 现在,当我使用 NavigableMap.firstEntry().getKey() 时,它会将“238060122695”作为第一个条目。
  • 我需要将 238160122691 作为第一个条目读取,因为这是作为第一个条目添加到地图中的。
  • 钻研字符串值我知道2380在2381之前,不管,为什么我上次添加的时候它把它当作第一个条目,是不是因为SortedMap接口这样做。?如何避免

这是按执行顺序排列的代码:

NavigableMap.put("238160122691", arrayListValue);

NavigableMap.put("238160122692", arrayListValue);

NavigableMap.put("238160122693", arrayListValue);

NavigableMap.put("238160122694", arrayListValue);

NavigableMap.put("238060122695", arrayListValue);

【问题讨论】:

  • "即使这是最后添加到 NavigableMap 中的。" NavigableMap 在做什么似乎存在误解。它不按插入顺序排序,而是按元素相互比较的方式排序。这样一来,“2380...”显然比所有“2381...”都要小
  • @tobias_k 是的,我也将这部分添加到我的问题中,谢谢。但是我该如何避免呢?
  • A NavigableMapTreeMap 类似,使用项目的 compareTohashCodeequals 方法来确定排序。它与插入顺序完全无关。如何避免?使用不同的数据结构,可能是LinkedHashMap
  • NavigableMap 对地图进行排序,这就是重点。如果要插入 9oder,请使用 LinkedHashMap

标签: java data-structures hashmap


【解决方案1】:

NavigableMap排序

SortedMap 扩展了导航方法,返回给定搜索目标的最接近匹配项。 [...] 可以按升序或降序键顺序访问和遍历 NavigableMap。

如果您希望条目按插入顺序,请使用LinkedHashMap

Map 接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与 HashMap 的不同之处在于它维护一个双向链表,该列表贯穿其所有条目。该链表定义了迭代顺序,通常是键插入映射的顺序(插入顺序)。

【讨论】:

  • 谢谢,我离开了 Linked Hashmap,因为我首先要做以下检查 = NavigableMap.firstEntry().getKey();上一页 = NavigableMap.lowerEntry(M.getKey()) ; next = NavigableMap.higherEntry(M.getKey()),然后我首先与下一个进行比较,然后移至下一组重复项。
【解决方案2】:

钻研字符串值我知道2380在2381之前,不管,为什么我上次加的时候把它当作第一个条目,是不是因为SortedMap接口这样做?

似乎对NavigableMap 及其实现类TreeMap 所做的事情存在误解。他们不按插入顺序对元素进行排序,而是按其自然顺序(即它们如何compareTo 彼此),或给定另一个Comparator

如何避免?

好吧,您可以将字符串键包装到一个数据结构中,该结构还具有一个显示何时将其插入映射的数字,并提供按该数字排序的 Comparator 或 compareTo 方法。但更有可能的是,NavigableMap 不是适合您的数据结构。您是否考虑过只使用列表或队列,或者可能是 cmets 中建议的 LinkedHashMap

【讨论】:

  • 谢谢,我从 List 移动到 NavigableMap 因为我的数据条目集可以包含许多条目或不同的条目,然后代码将读取下一组重复条目并使用它们等等,我会尝试按照您的建议包装成数据结构。
【解决方案3】:

谢谢大家,我已经按照大家的建议搬回了LinkedList。

然后我发现使用 ListIterator 来查找下一个条目并将其存储在一个变量中以与下一个迭代进行比较。

ListIterator<Map.Entry<String, ArrayList<DataModel>>> listIterator = new LinkedList(myHashMap.entrySet()).listIterator();


 String previousk, nextk = null;
 Boolean entered = false;

    while (listIterator.hasNext())
    {
        if(entered){
            previousk = nextk.substring(0,12);
            if(previousk != nextk.substring(0,12)){
                *Set the flag here to be used*
            }
        }
        nextk = listIterator.next().getKey();
        entered = true;
        System.out.println(nextk);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    相关资源
    最近更新 更多