jjzjj

Comparator

全部标签

Java TreeMap 自定义比较器奇怪的行为

我正在尝试创建一个带有排序键的Map,先按字母顺序排序,最后按数字排序。为此,我使用了带有自定义Comparator的TreeMap:publicstaticComparatorALPHA_THEN_NUMERIC_COMPARATOR=newComparator(){@Overridepublicintcompare(Stringfirst,Stringsecond){if(firstLetterIsDigit(first)){return1;}elseif(firstLetterIsDigit(second)){return-1;}returnfirst.compareTo(sec

Java 8 : implementing Comparable

我喜欢Comparator的新静态工厂方法,因为它们允许以非常简洁且不易出错的方式实现比较器。但是实现Comparable的推荐方法是什么?我们应该在Comparable实现中使用Comparators吗?publicMyClassimplementsComparable{...publicintcompareTo(MyClassother){ComparatornaturalOrderComparator=Comparator.comparing(MyClass::getFoo).thenComparing(MyClass::getBar);returnnaturalOrderCom

java - 比较器违反一般契约(Contract)

以下代码是DaveKoelle'sAlphanumComparator的编辑版本.编辑包含将空字符串排序到列表末尾的代码,或者在我的例子中是JTable的底部。问题是java.lang.IllegalArgumentException:Comparisonmethodviolatesitsgeneralcontract!发生。为了解决我的问题,我调查了它并找到了诸如比较器没有在正确位置的return0;之类的原因。我还在Javabugdatabase中找到了一条评论读Thesortingalgorithmusedbyjava.util.Arrays.sortand(indirectly

java - 如何让 Comparator.comparing 正确推断类型参数?

我有以下类(class):importjava.util.ArrayList;importjava.util.Comparator;importjava.util.List;importorg.apache.commons.lang3.tuple.Pair;publicclassSorter{privateList>dtoPairs=newArrayList();publicSorter(){Comparator>bySize=Comparator.comparing(Pair::getLeft);Comparator>byName=Comparator.comparing(p->p.

java - Java 中比较器接口(interface)的构造函数

我知道接口(interface)不能有构造函数,我们不能创建接口(interface)的对象。这是不可能的:Comparatorcmp=newComparator();我不明白如何使用关键字“newComparator()”创建匿名内部类。这个关键字不是创建了一个Comparator类型的对象吗?完整代码如下:importjava.util.ArrayList;importjava.util.Collections;importjava.util.Comparator;importjava.util.List;publicclassDemoApp{publicstaticvoidmai

java - Java 中的功能等价

我正在阅读EffectiveJava,并遇到了JoshuaBloch推荐的情况classMyComparatorextendsComparator{privateMyComparator(){}privatestaticfinalMyComparatorINSTANCE=newMyComparator();publicintcompare(Strings1,Strings2){//Omitted}}XYZComparatorisstateless,ithasnofields.henceallinstancesoftheclassarefunctionallyequivalent.Thu

java - 从另一个函数返回 `Comparator`

首先,请让我清楚,我受API设计的限制,所以请不要更改API,但是可以添加私有(private)函数。publicclassPointimplementsComparable{publicPoint(intx,inty)//constructsthepoint(x,y)publicvoiddraw()//drawsthispointpublicvoiddrawTo(Pointthat)//drawsthelinesegmentfromthispointtothatpointpublicStringtoString()//stringrepresentationpublicintcomp

java - 我想对两个不同的参数使用 Collections.sort() 两次

这个问题在这里已经有了答案:HowdoImake2comparablemethodsinonlyoneclass?(3个答案)关闭7年前。我有一个对象列表,我想使用不同的属性对其进行排序。@OverridepublicintcompareTo(Objectobj){Fieldtab=(Field)obj;intobjx=Integer.parseInt(tab.getX());//intobjy=Integer.parseInt(tab.getY());intclassX=Integer.parseInt(this.X);if(classX==objx)return0;elseif(c

java - 在 Java 中,按 key.length() 对 hashmap 进行排序

我有一个像这样的HashMap:HashMapmap=newHashMap();map.put("java",4);map.put("go",2);map.put("objective-c",11);map.put("c#",2);现在我想按键长度对这个映射进行排序,如果两个键的长度相等(例如go和c#的长度均为2),则按alphba顺序排序。所以我希望得到的结果是这样的:打印结果:目标-C,11java,4#,2去吧,2这是我自己的attamp,但是一点用都没有...HashMapmap=newHashMap();map.put("java",4);map.put("go",2);m

java - 为什么lambda表达式可以用作比较器?

OCPStudyGuide书中有一个关于比较器的示例,可以通过两种方式对其进行初始化。第一种是通过这样的匿名类:ComparatorbyWeight=newComparator(){publicintcompare(Duckd1,Duckd2){returnd1.getWeight()-d2.getWeight();}};这个我能理解。根据这本书,这可以用这样的lambda表达式代替:ComparatorbyWeight=(d1,d2)->d1.getWeight()-d2.getWeight();现在这个我不明白。lambda表达式不返回Comparator对象,我现在认为它不能返回