首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Java中只对键进行排序的多映射

在Java中只对键进行排序的多映射
EN

Stack Overflow用户
提问于 2011-03-31 14:29:16
回答 8查看 21.9K关注 0票数 25

我想有一个c.g.c.c.Multimap,这是排序的基础上只关键字。这些值不应该排序。我曾尝试用芭乐的TreeMultimap构建一些东西,但我不能使用它,因为值类型没有实现Comparable

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyObject /* doesn't implement Comparable */ {
  private String name;
  private int score;
  // Getters/setters are implemented
  public static Function<MyObject,Integer> myObjectToScore {
    @Override public Integer apply (MyObject o) { return o.score; }
  }
  public static Multimap<Integer,MyObject> indexOnScore(Iterable<MyObject> i) {
    Multimap<Integer,MyObject> m = Multimaps.index(i, myObjectToScore());
    // Do the sort of the keys.
    return m;
  }
}

我曾考虑过获取键的SortedSet,然后迭代排序集中的每个键以获取各种值,但我希望使用Guava中现有的(尚未发现的)特性,而不是使用这种hack。

注意:我不会让MyObject实现Comparable,因为它对我的实际对象没有任何意义。

输入/输出示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Set<MyObject> s = Sets.newHashSet(
  new MyObject("a", 2),
  new MyObject("b", 3),
  new MyObject("c", 1),
  new MyObject("d", 3),
  new MyObject("e", 1)
); // Assuming constructor MyObject(String name, int score)

for (Map.Entry<Integer, MyObject> e: MyObject.indexedOnScore(s).entries()) {
  System.out.printf("%d -> %s%n", e.getKey(), e.getValue().getName());
}

打印:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 -> c // or switched with line below
1 -> e
2 -> a
3 -> b // or switched with line below
3 -> d
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-03-31 15:07:32

Multimaps.index返回一个ImmutableListMultimap,因此您在创建它之后将无法对其进行排序。但是,您可以首先创建Iterable<MyObject>的排序副本,并将其提供给Multimap.index……ImmutableListMultimap会按给定的顺序保存内容。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static ImmutableMultimap<Integer, MyObject> indexOnScore(Iterable<MyObject> i) {
  List<MyObject> sorted = Ordering.natural().onResultOf(myObjectToScore())
      .sortedCopy(i);
  return Multimaps.index(sorted, myObjectToScore());
}

另一种选择可能是创建一个TreeMultimap,并使用Ordering.arbitrary()作为值的Comparator

票数 22
EN

Stack Overflow用户

发布于 2014-07-10 11:08:11

在Guava 16中引入了MultimapBuilder

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<K extends Comparable<? super K>, V> ListMultimap<K, V> multimap() {
    return MultimapBuilder.treeKeys().linkedListValues().build();
}

这将使您的键按其自然顺序排序(MultimapBuilder::treeKeys也会被重载以接受自定义比较器),并且与每个键关联的值将在LinkedList中维护(ArrayListHashSet是其他选项之一)。

票数 17
EN

Stack Overflow用户

发布于 2011-11-03 23:33:59

虽然OP的特定情况似乎已经使用不可变的multimap构建函数得到了回答,但我需要一个他所要求的可变版本。如果它对任何人有帮助,下面是我最终创建的泛型方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static <K, V> Multimap<K, V> newTreeArrayListMultimap(
    final int expectedValuesPerKey)
{
    return Multimaps.newMultimap(new TreeMap<K, Collection<V>>(),
        new Supplier<Collection<V>>()
        {
            @Override
            public Collection<V> get()
            {
                return new ArrayList<V>(expectedValuesPerKey);
            }
        });
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5501468

复制
相关文章
在 JavaScript 中对数组进行排序
排序是您在学习JavaScript时将使用的众多基本方法之一。让我们回顾一下如何对不同的数据类型使用排序方法。
腾龙
2022/06/02
4.9K0
EF Core中的多对多映射如何实现?
EF 6.X中的多对多映射是直接使用HasMany-HasMany来做的。但是到了EF Core中,不再直接支持这种方式了,可以是可以使用,但是不推荐,具体使用可以参考《你必须掌握的EntityFramework 6.X与Core 2.0》一文。在这里我就详细的说下如何在EF core下实现。 首先就是实体类的建立:
Ryan_OVO
2023/10/19
3580
Java——简单Java类深入(数据表与简单Java类、一对多映射、双向一对多映射、多对多映射)
简单Java类是整个项目开发的灵魂,其有严格的开发标准,最为重要的是它要与数据表完全对应。由于目前没有接触过多的程序设计功能,所以对于此处的访问就有了一些限制,目前要求可以完成如下两个操作:
Winter_world
2020/09/25
2.6K0
Java——简单Java类深入(数据表与简单Java类、一对多映射、双向一对多映射、多对多映射)
多业务建模在美团搜索排序中的实践
美团搜索排序是一个典型的多业务混合排序建模问题,这种多业务场景搜索存在很多挑战。本文聚焦到店商家多业务场景的多业务排序建模优化工作,希望能对从事相关工作的同学有帮助。
美团技术团队
2021/07/30
1K0
在 Hibernate Search 5.5 中对搜索结果进行排序
“秩序,秩序”- 有时不仅仅下议院尊敬的议员需要被喊着让排序,而且在特殊情况下 Hibernate 的查询结果也需要排序。
知忆
2021/06/08
2.9K0
在R里面对坐标进行映射
这里的重点其实是grange对象和intersect及findOverlaps函数的使用。
生信技能树
2018/12/25
8970
在R里面对坐标进行映射
Python+OpenGL进行立方体多纹理映射
Python扩展库pyopengl完美地封装了OpenGL,从而使得可以使用Python编写计算机图形学程序。如果使用pip在线安装不成功的话,可以下载whl文件然后本地安装。 本文代码使用Python+OpenGL对立方体进行贴图,并且每个面的纹理不相同。之前发过一个类似的,不过那个是6个面的纹理一样,见Python实现立方体纹理映射 import sys from OpenGL.GL import * from OpenGL.GLUT import * from OpenGL.GLU import *
Python小屋屋主
2018/04/16
2.4K0
Python+OpenGL进行立方体多纹理映射
Hibernate之关联关系映射(一对多和多对一映射,多对多映射)
别先生
2018/01/02
4.7K0
Hibernate之关联关系映射(一对多和多对一映射,多对多映射)
NHibernate 多对多映射的数据更新
最近在用 NHibernate 做多对多更新时突然发现 NHibernate 更新的策略很差, 对多对多关系的更新居然是先全部删除再插入全部数据, 感觉非常奇怪, 现在还原如下:
beginor
2020/08/10
9520
NHibernate 多对多映射的数据更新
java中的排序算法
Java 中提供了丰富的排序算法,可以满足各种排序需求,下面是 Java 中常用的排序算法及其实现。
堕落飞鸟
2023/04/02
6540
Entity Framework 多对多映射
上一篇文章我们讲解了EF中的一对对多的关系映射,这篇文章我们讲解EF中的多对多(Many-to-Many Relationship)关系映射。这篇文章我们同样通过一个简单的例子来讲解多对多的关系映射。
喵叔
2020/09/08
1.1K0
Entity Framework 多对多映射
如何使用Fluent Nhibernate中的Automapping进行OR Mapping映射
由于在项目中使用了NHibernate来作为ORMapping构建数据访问层,那么就必须要配置Object和DataTable的映射。最早的项目中,我们使用了最传统的XML配置文件的方式编写映射关系,但是这样太麻烦,每次修改class和表时都要去修改对应的XML文件,而且还容易出错,一定有疏忽遗漏的地方,还不容易找出错误,所以在第二个项目中,我们使用了Fluent NHibernate的Mapping方式代替XML配置。使用Fluent NHibernate的最大好处是降低了出错的机会,因为Fluent Nhibernate的配置是使用C#来编写,可以智能感知,而且还能编译,不像原始的XML配置,写错了都不知道。
深蓝studyzy
2022/06/16
1.1K0
java中 数组排序,集合排序
第一种 就是重写方法我 觉得这种太蠢了!不描述 百度搜索sort()降序会出来一大堆。
斯文的程序
2019/11/07
1.4K0
java中 数组排序,集合排序
Python中对list进行排序
很多时候,我们需要对List进行排序,Python提供了两个方法 对给定的List L进行排序, 方法1.用List的成员函数sort进行排序 方法2.用built-in函数sorted进行排序(从2.4开始) 这两种方法使用起来差不多,以第一种为例进行讲解: 从Python2.4开始,sort方法有了三个可选的参数,Python Library Reference里是这样描述的 cmp:cmp specifies a custom comparison function of two arguments (iterable elements) which should return a negative, zero or positive number depending on whether the first argument is considered smaller than, equal to, or larger than the second argument: "cmp=lambda x,y: cmp(x.lower(), y.lower())" key:key specifies a function of one argument that is used to extract a comparison key from each list element: "key=str.lower" reverse:reverse is a boolean value. If set to True, then the list elements are sorted as if each comparison were reversed.In general, the key and reverse conversion processes are much faster than specifying an equivalent cmp function. This is because cmp is called multiple times for each list element while key and reverse touch each element only once. 以下是sort的具体实例。 实例1: >>>L = [2,3,1,4] >>>L.sort() >>>L >>>[1,2,3,4] 实例2: >>>L = [2,3,1,4] >>>L.sort(reverse=True) >>>L >>>[4,3,2,1] 实例3: >>>L = [('b',2),('a',1),('c',3),('d',4)] >>>L.sort(cmp=lambda x,y:cmp(x[1],y[1])) >>>L >>>[('a', 1), ('b', 2), ('c', 3), ('d', 4)] 实例4: >>>L = [('b',2),('a',1),('c',3),('d',4)] >>>L.sort(key=lambda x:x[1]) >>>L >>>[('a', 1), ('b', 2), ('c', 3), ('d', 4)] 实例5: >>>L = [('b',2),('a',1),('c',3),('d',4)] >>>import operator >>>L.sort(key=operator.itemgetter(1)) >>>L >>>[('a', 1), ('b', 2), ('c', 3), ('d', 4)] 实例6:(DSU方法:Decorate-Sort-Undercorate) >>>L = [('b',2),('a',1),('c',3),('d',4)] >>>A = [(x[1],i,x) for i,x in enumerate(L)] #i can confirm the stable sort >>>A.sort() >>>L = [s[2] for s in A] >>>L >>>[('a', 1), ('b', 2), ('c', 3), ('d', 4)] 以上给出了6中对List排序的方法,其中实例3.4.5.6能起到对以List item中的某一项 为比较关键字进行排序. 效率比较: cmp < DSU < key 通过实验比较,方法3比方法6要慢,方法6比方法4要慢,方法4和方法5基本相当 多关键字比较排序: 实例7: >>>L = [('d',2),('a',4),('b',3),('c',2)] >>> L.sort(key=lambda x:x[1]) >>> L >>>[('d', 2), ('c', 2), ('b', 3), ('a', 4)] 我们看到,此时排序过的L是仅仅按照第二个关键字来排的,如果我们想用
py3study
2020/01/09
2.4K0
java高级用法之:在JNA中将本地方法映射到JAVA代码中
不管是JNI还是JNA,最终调用的都是native的方法,但是对于JAVA程序来说,一定需要一个调用native方法的入口,也就是说我们需要在JAVA方法中定义需要调用的native方法。
程序那些事
2022/04/13
1.1K0
Python学习记录06-字典中的键映射多个值
如果想一个key映射多个value, 我们就需要让value也是一个容器,可以是列表,也可以集合。看具体的使用场景。列表的特性是可以保持顺序,集合的特性是可以去重。 可以用以下的方式来创建一个映射多个value 的字典
huolong
2023/09/07
4730
java高级用法之:在JNA中将本地方法映射到JAVA代码中
不管是JNI还是JNA,最终调用的都是native的方法,但是对于JAVA程序来说,一定需要一个调用native方法的入口,也就是说我们需要在JAVA方法中定义需要调用的native方法。
程序那些事
2022/04/01
1.2K0
java之hibernate之双向的多对一关联映射
这篇讲解 双向的多对一关联映射 1.表结构和多对一时,一致 2.类结构 Book.java public class Book implements Serializable{ private
Vincent-yuan
2019/09/11
5390
java之hibernate之双向的多对一关联映射
排序算法在JDK中的应用(二)快速排序
在分析上述代码时,可以发现程序会在特殊的情况调用sort()方法即改进后得快速排序,接下来就来分析sort()快速排序的代码实现。
算法与编程之美
2019/07/17
1.1K0
java中的排序--排序容器_TreeSet与TreeMap
(1)Set接口:HashSet,元素必须重写hashcode和equals方法。
wfaceboss
2019/04/08
1.8K0
java中的排序--排序容器_TreeSet与TreeMap

相似问题

Java -只对数组进行排序

42

多键Java映射

50

Java:多键/值映射

31

同时使用键和值对多映射进行排序

43

在Java中:获取按映射键排序的映射值数组

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文