哪些java集合有序_关于集合:Java有序映射

在爪哇中,是否有一个对象像一个用于存储和访问密钥/值对的映射,但是可以返回一个有序的密钥列表和一个有序的值列表,使得密钥和值列表是相同的顺序。

因此,作为代码解释,我正在寻找一些行为类似于我虚构的orderedmap的东西:

OrderedMap om = new OrderedMap<>();

om.put(0,"Zero");

om.put(7,"Seven");

String o = om.get(7); // o is"Seven"

List keys = om.getKeys();

List values = om.getValues();

for(int i = 0; i < keys.size(); i++)

{

Integer key = keys.get(i);

String value = values.get(i);

Assert(om.get(key) == value);

}

分类地图

如果您所要做的就是同时遍历这两个映射,那么map.entryset()将允许您在任何映射上都这样做。LinkedHashMap有一个定义良好的顺序,但是对于任何映射,条目集都反映了键/值对。

这段代码不是一个很好的示例,因为任何映射实现都将表现为示例代码。是否排序、排序。

彼得·劳里:你能把这个扩展一下吗?map接口分别以集合和集合的形式返回键和值。这两种方法都不能保证顺序,所以说每个映射实现的行为都像我的示例代码中那样似乎不明智。

在Sun JDK实现中,getKeys和getValues()集返回的集由映射中的entryset()支持,因此具有相同的迭代顺序,这就是您的示例测试。

很有趣,我从没注意到。尽管如此,还是叫我疯狂,但我不喜欢对接口未显式验证的实现进行假设。我以前做过太多次了。

这应该被命名为Java排序映射,因为有序映射是不同的——参见EDCOX1(0)。

实现映射和保持插入顺序的Java类的可能副本?

SortedMap接口(与实现树映射)应该是您的朋友。

接口具有以下方法:

keySet(),按升序返回一组键。

values()返回按相应键的升序排列的所有值的集合。

所以这个接口完全满足您的需求。但是,这些键必须有一个有意义的顺序。否则,可以使用LinkedHashMap,其中顺序由插入顺序决定。

示例:sortedmapmap=new treemap<>();

要使用treemap,它要求key类必须实现可比较的接口。如果不是,则将引发某种RuntimeException。Treemap它也是经过排序的地图,但我认为作者希望使用只是经过排序(未排序)的地图。Linkedhashmap最好只获取有序的映射(如您所说,"由插入顺序决定")。

如果在构建期间(假设您不使用Comparator.naturalOrder())给它一个合适的Comparator,那么TreeMap不需要密钥类来实现Comparable。

这个答案可以通过演示如何遍历keyset()来改进。

Is there an object that acts like a Map for storing and accessing key/value pairs, but can return an ordered list of keys and an ordered list of values, such that the key and value lists are in the same order?

您正在查找java.util.linkedhashmap。您将得到map.entry对的列表,这些对总是以相同的顺序迭代。该顺序与您放入项目的顺序相同。或者,使用java.util.sortedmap,其中键必须具有自然顺序或由Comparator指定。

为了避免读者重复检查,因为很难通过测试来验证,keySet()方法有效地返回一个LinkedHashset,它反映了put()调用的顺序。请注意,对同一个密钥重复调用put()不会更改顺序,除非您提前使用remove()密钥。

LinkedHashMap维护键的顺序。

java.util.linkedhashmap的工作方式与普通的hashmap类似。

这并不能回答这个问题。要评论或要求作者澄清,请在他们的帖子下面留下评论-你可以随时对自己的帖子发表评论,一旦你有足够的声誉,你就可以对任何帖子发表评论。

@我认为这是一个真实的答案,但它与约翰·费米内拉的答案非常相似!

如果你想得到一个有序的映射,当你把条目放入映射时,它们按这个顺序存储,那么LinkedHashMap是正确的答案。如果您想将地图中的条目按照放置顺序进行排序,那么sortedMap是正确的答案。

我认为从框架中得到的最接近的集合是sortedmap

如果我认为这个答案值得输掉分数,我会投反对票。正如上面的答案所指出的,您的答案缺少关于Linkedhashmap的适当信息,对Sortedmap进行一点解释也不错。

@科莱森,在这种情况下,你投的是最好的答案,而不是投的是正确但不是最好的答案。

我就是这么做的。只是说我能理解为什么会有人投反对票。

您可以利用navigablemap接口,该接口可以按升序或降序访问和遍历。此接口旨在取代SortedMap接口。导航地图通常按照其键的自然顺序进行排序,或者通过地图创建时提供的比较器进行排序。

它有三个最有用的实现:treemap、immutablesortedmap和concurrentskiplistmap。

treemap示例:

TreeMap users = new TreeMap();

users.put("Bob", 1);

users.put("Alice", 2);

users.put("John", 3);

for (String key: users.keySet()) {

System.out.println(key +" (ID ="+ users.get(key) +")");

}

输出:

Alice (ID = 2)

Bob (ID = 1)

John (ID = 3)

由于Java 6还存在对TeMeAP的非阻塞线程安全替代。参见Concurrentskiplistmap。

我认为sortedmap接口强制执行您请求的内容,treemap实现了这一点。

http://java.sun.com/j2se/1.5.0/docs/api/java/util/sortedmap.htmlhttp://java.sun.com/j2se/1.5.0/docs/api/java/util/treemap.html

我使用简单的哈希图、链接列表和集合按值对映射进行排序。

import java.util.*;

import java.util.Map.*;

public class Solution {

public static void main(String[] args) {

// create a simple hash map and insert some key-value pairs into it

Map map = new HashMap();

map.put("Python", 3);

map.put("C", 0);

map.put("JavaScript", 4);

map.put("C++", 1);

map.put("Golang", 5);

map.put("Java", 2);

// Create a linked list from the above map entries

List> list = new LinkedList>(map.entrySet());

// sort the linked list using Collections.sort()

Collections.sort(list, new Comparator>(){

@Override

public int compare(Entry m1, Entry m2) {

return m1.getValue().compareTo(m2.getValue());

}

});

for(Entry value: list) {

System.out.println(value);

}

}

}

输出是:

C=0

C++=1

Java=2

Python=3

JavaScript=4

Golang=5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值