Java 如何使用数值范围的比较器?
假设我有一个类Java 如何使用数值范围的比较器?,java,sorting,comparator,Java,Sorting,Comparator,假设我有一个类Person,属性为年龄和姓名。我想订购一份使用年龄范围的人员列表,例如,在该范围内的姓名。 例如,这些范围可以是10年。一个更形象的例子: 人1:10尼克 人2:13阿尔伯特 第3人:26亚历克斯 人4:22奥利弗 比较器应返回person 2>person 1>person 3>person 4 我尝试使用Math.abs(p1.age-p2.age)实现一个比较器,但它并没有像预期的那样工作 在这种情况下,如何实现比较器以使用年龄属性的范围返回比较器?您需要将年龄除以10
Person
,属性为年龄和姓名。我想订购一份使用年龄范围的人员列表,例如,在该范围内的姓名。
例如,这些范围可以是10年。一个更形象的例子:
- 人1:10尼克
- 人2:13阿尔伯特
- 第3人:26亚历克斯
- 人4:22奥利弗
比较器应返回person 2>person 1>person 3>person 4
我尝试使用Math.abs(p1.age-p2.age)
实现一个比较器,但它并没有像预期的那样工作
在这种情况下,如何实现比较器以使用年龄属性的范围返回比较器?您需要将年龄除以10-使用整数除法将丢弃“1”部分,并留下易于比较的整数。Java 8的comparator语法使其非常优雅:
List<Person> people = /* initialize the list... */
people.sort(Comparator.comparingInt((Person p) -> p.getAge() / 10)
.thenComparing(Person::getName));
List people=/*初始化列表*/
people.sort(Comparator.comparingit((Person p)->p.getAge()/10)
.然后比较(Person::getName));
检查这一点,我怀疑Comparator.comparingInt(p->p.getAge()/10)。然后比较(Person::getName,Collator.getInstance())
会起作用。修复了拼写错误,并添加了缺少的类型,因为在链接方法时推理引擎无法识别它。;-)如果我有双份的呢?例如,有些人吃了多少份蛋糕而不是老化。使用类似于2.3、3.6、3.9的值。它会是Comparator.comparingDouble(p->p.getParties()/10.0)
?@Gerardo可能不会。如果要比较实际数字(例如,3.6小于3.9),则无需除以10。如果您想要一些地板效果(例如,将3.6和3.9视为“3和某物”),则必须将floor
,或cst改为int
anyway@Mureinik对不起,我不能胜任,但是我怎么能在0,5的范围内做到你所说的呢。例如,0、0.1、0.2、0.3、0.4和0.5是相同的插槽。然后是0.6、0.7、0.8、0.9、1,等等。我不知道哪种地板效果可以工作,好像我对它进行舍入可能会有副作用。@Gerardo这看起来几乎像舍入,但不幸的是,Java向上舍入0.5,而不是向下舍入。不过,您可以改为使用:myList.sort(Comparator.comparingDouble((Person p)->new BigDecimal(p.getAge()).setScale(0,BigDecimal.ROUND_HALF_DOWN)。doubleValue())