Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用数值范围的比较器?_Java_Sorting_Comparator - Fatal编程技术网

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())