Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Java中只对键进行排序的多映射

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

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

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

代码语言:javascript
运行
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
运行
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
运行
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
运行
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
运行
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
运行
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

复制
相关文章
java中&&和&的区别
&&和&都是用于“与”运算,不同的是&&是逻辑与,&是按位与,所谓逻辑与指的是两个判断条件在都为true时结果为true,举个生活中例子,比如英语成绩大于90与数学成绩大于90才是好学生一样,代码如下:
全栈程序员站长
2021/07/07
7190
Java中&和&&的区别
首先给i赋值为0,如果i大于10,并且i++等于1,则输出“错误”和i的值。否则输出“正确”和i的值。分别用&和&&运行,观察运行结果的不同。
算法与编程之美
2022/10/28
4690
Java中&和&&的区别
java中 +=和+的区别[通俗易懂]
java中+=的意义包含两部分,一是”+”,就是通常所说的直接相加,二是改变结果的类型,将计算结果的类型转换为”+=符号左边的类型。
全栈程序员站长
2022/09/08
7630
java中&和&&的区别和联系
当: str != null 的时候,接下来才会去执行: !"".equals(str)
Hongten
2018/09/13
1K0
Java中==和equals的区别
在Java中,equals是在object类中的方法,在object中equals是用来看看两个参数是否引用的是同一个对象,而 == 可用于判断两个对象的地址是否相等,那么equals和 == 有什么区别?
算法与编程之美
2023/08/22
1620
Java中==和equals的区别
java中 this和super的区别
this表示当前调用方法的对象的引用: (谁调用这个方法,谁就是这个对象,这个this就是它的引用) 比如: <pre name="code" class="java">public class This_Demo{ String name; public void setName(String name) { this.name = name;// 前一个name是 本类的成员属性: name;后一个name是setName中的参数。 } public s
MickyInvQ
2020/09/27
2870
Java中==和equals的区别
1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean 
JaneYork
2023/10/11
1480
Java中==和equals的区别
java中“==”和equal区别
8个月以后就要正式找工作啦,我觉得现在是时候花时间好好深入研究一下以前比较混肴的知识。这就当作是自我成长的第一步!
哲洛不闹
2018/09/19
5510
java中“==”和equal区别
JAVA中&&和&、||和|的区别?「建议收藏」
&&逻辑与 也叫做短路与 因为只要当前项为假,它就不往后判断了,直接认为表达式为假
全栈程序员站长
2022/09/08
4990
Java中this和super的区别和应用
Java中this和super的区别和应用 1 /* 2 问题是: 3 1.我不仅仅要输出局部范围的变量num,还要输出本类成员范围的变量num。怎么办呢? 4 2.我还想要输出父类成员范围的变量num。怎么办呢? 5 如果有一个东西和this相似,但是可以直接访问父类的数据就好了。 6 恭喜你,这个关键字是存在的:super。 7 8 this和super的区别? 9
黑泽君
2018/10/11
9200
java中的stringbuffer是什么_java中&和&&的区别
JAVA提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。
全栈程序员站长
2022/11/08
9520
Java中sleep和wait的区别
2、sleep方法使当前线程暂停执行指定的时间,让出cpu给其他线程,但是它的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态。在调用sleep方法后,线程不会释放对象锁;
编程大道
2019/08/26
3.3K0
java中error和exception的区别
Error类和Exception类的父类都是throwable类,他们的区别是: Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。
老马的编程之旅
2022/06/22
4320
java中重载和重写的区别
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
全栈程序员站长
2022/09/08
6980
java中Comparable和Comparator的区别
java.lang.Comparable和java.util.Comparator是两个容易混淆的接口,两者都带有比较的意思,那么两个接口到底有什么区别,分别在什么情况下使用呢?
子润先生
2021/06/22
3300
Java中equals和hashcode的区别
== 运算符用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能使用 “==” 运算符。
程序员Leo
2023/08/02
1930
java中Runnable和Callable的区别
在java的多线程开发中Runnable一直以来都是多线程的核心,而Callable是java1.5添加进来的一个增强版本。
程序那些事
2020/07/08
8050
java中堆和栈的区别
堆和栈都是Java用来在RAM中存放数据的地方。 堆 (1)Java的堆是一个运行时数据区,类的对象从堆中分配空间。这些对象通过new等指令建立,通过垃圾回收器来销毁。 (2)堆的优势是可以动态地分配内存空间,需要多少内存空间不必事先告诉编译器,因为它是在运行时动态分配的。但缺点是,由于需要在运行时动态分配内存,所以存取速度较慢。  栈 (1)栈中主要存放一些基本数据类型的变量(byte,short,int,long,float,double,boolean,char)和对象的引用。 (2)栈的优势是,存取
nnngu
2018/03/15
8950
Java中int和Integer的区别
Java是面向对象的编程语言,一切都是对象,但是为了编程的方便还是引入了基本数据类型,为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换,对应如下:
joshua317
2021/03/16
8040
Java中executeUpdate和executeQuery的区别
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/01
2510

相似问题

Java中=+和+=的区别?

20

java中"this“和不带"this”的区别

50

+=和=+在java中的区别?

44

java脚本中"==“和"===”的区别

13

Java中"==“和”相等“的区别

42
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档