草庐IT

comparator

全部标签

java - 适用于TreeSet无区分字段时的比较器

假设我有一个类没有实现Comparable界面像classDummy{}以及此类实例的集合以及该类外部的一些函数,这些函数允许部分比较这些实例(下面将使用映射来实现此目的):Collectioncol=newArrayList();Mapmap=newHashMap();for(inti=0;i现在我想使用TreeSet对这个集合进行排序带有自定义比较器的类:TreeSetsorted=newTreeSet(newComparator(){@Overridepublicintcompare(Dummyo1,Dummyo2){returnmap.get(o1)-map.get(o2);}

Java 8 比较器链与单个属性的反向

我正在使用Comparator对Student对象列表进行排序。我想反转id属性的排序,但是使用reverse()方法将它应用于整个排序。如何让它只发生在id上?到目前为止,这是我的代码:publicListgetStudents(Listevents){ComparatorcomparatorStudents=Comparator.comparing(Student::getCGPA).thenComparing(Student::getName).thenComparingInt(Student::getID).reverse();Liststudents=newArrayList

java "not comparable"异常?

我正在制作一个实现可比性的自定义类,如果有人试图比较两个根据我的定义不可比的对象,我想抛出某种异常。API中是否已有合适的异常,还是我需要自己创建? 最佳答案 据我所知不是。最准确的异常表示可能是IllegalArgumentException:http://docs.oracle.com/javase/7/docs/api/java/lang/IllegalArgumentException.html您可能还应该实现Comparable这将防止调用者提供错误类的实例。 关于java"n

Java 8 : How to compare all elements of a Set

这可能是一个已经问过的问题,但我找不到我需要的答案。我有一个包含对象的集合publicclassMyObject{privateLocalDatedateBeginning;privateLocalDatedateEnd;publicbooleanoverlap(MyObjectotherDate){/*codetocheckoverlapping*/}}我需要检查Set是否包含相互重叠的元素。在“旧Java”中,我会遍历该集合两次并检查所有存在的组合,然后在找到它时中断或返回。我们如何在Java8中使用流和lambda来做到这一点?我已经尝试过reduction()和filter()

java - Java 8's HashMap misbehaves if the keys implement Comparable in a way that isn' t 与equals一致是不是bug?

我知道从Java8开始,如果HashMap有足够多的哈希冲突,并且键实现了Comparable,它会useabalancedtreeinsteadofalinkedlistforthebin.但据我所知,Comparable接口(interface)doesnotrequirecompareTo()应“与equals()一致”(尽管强烈建议这样做)。我错过了什么吗?似乎新的实现允许HashMap违反Map接口(interface)的要求,如果键恰好具有兼容但不推荐的Comparable实现。以下JUnit测试在OpenJDK8u72上暴露了此行为:importstaticorg.jun

java - 为什么 Temporal 不在 Java 8 jsr310 中扩展 Comparable

java.time.temporal.Temporal的文档包含以下说明:ImplementationRequirements:[...]AllimplementationsmustbeComparable.为什么Temporal不只是扩展Comparable?背景:我想使用可比较的时间(而不是像LocalDateTime等子类型)并且不得不求助于一种有点难以辨认的类型>这也搞乱了NetBeans的自动完成功能。编辑:我想实现一个时间间隔。contains(Intervali)、contains(Temporalt)、overlaps(...)、adjoins(...)等的明显实现使用

java - Comparator 是类型类吗?

我一直在阅读Scala中的类型类,并认为我已经很好地掌握了它,直到我想起了Java的java.util.Comparator。如果我理解正确的话,Ordering是类型类的原型(prototype)示例。我能想到的Comparator和Ordering实例之间的唯一区别是比较器必须是显式的,而排序可以而且通常是隐式的。Comparator是类型类吗?我得到(错误的?)印象,即Java实际上没有类型类。这是否意味着类型类需要能够是隐式的?我认为类型类的隐式转换主要是语法糖-尽管它很棒,但它“只是”给了编译器足够的提示-我是不是遗漏了什么?下面的代码示例展示了Comparator如何向没有

java - 是否按非传递比较器 "work"排序?

如果我提供一个不可传递的Comparator会发生什么至Collections.sort?我会遇到无限循环吗?我编写的一个小测试产生了一个输出,但我想确保情况始终如此。问题是在某些情况下,我的比较器会产生循环,在这种情况下我只想确保它不会陷入无限循环。我不关心实际结果。 最佳答案 Javadocs说你必须确保你的比较器是可传递的。如果您提供的比较器不符合要求,那么所有赌注都将被取消。它可能适用于给定的实现,但可能会在另一个实现中可怕地崩溃(C++中的std::sort确实如此)。简而言之,您不应该依赖它工作,即使它对某些或其他示例有

c++ - 法线贴图 : TBN matrix different result in vertex shader compared to fragment shader

我正在为教程开发法线贴图实现,出于教学目的,我想将TBN矩阵传递给片段着色器(从顶点着色器),这样我就可以将切线空间中的法线vector转换为世界-照明计算的空间。法线贴图应用于二维平面,其法线指向正z方向。但是,当我在平面的顶点着色器中计算TBN矩阵时(因此所有顶点的所有切线/副切线都相同),显示的法线完全关闭。如果我将切线/副切线和法线vector传递给片段着色器并在那里构造TBN,它工作得很好,如下图所示(显示法线):这就是奇怪的地方。因为平面是平坦的,所以它的所有顶点的T、B和Nvector都相同,因此每个片段的TBN矩阵也应该相同(因为片段插值不会改变任何东西)。顶点着色器中

c++ - std::atomic_compare_exchange_* 等如何与任意指针一起使用?

InterlockedCompareExchange在Windows中,以及__sync_val_compare_and_swap在gcc中采用指针,因此我可以传入任何地址,例如指向这些函数的共享内存块。对于非x86架构,我可能必须确保内存对齐以确保正确性,对于x86(可能还有其他),我可能希望确保缓存行对齐以提高性能,尽管正确性应该不是问题(->x86LOCK前缀)。为了摆脱我的代码中一些平台相关的东西(WindowsVC++与GCC),我查看了C++11的atomic_compare_exchange_weak。和friend。但它们都对std::atomic*类型的变量起作用.有