Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.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

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
返回值-1,0,1在Java集合排序和Comparator接口比较方法中的确切含义是什么?_Java_Sorting_Data Structures_Collections_Comparator - Fatal编程技术网

返回值-1,0,1在Java集合排序和Comparator接口比较方法中的确切含义是什么?

返回值-1,0,1在Java集合排序和Comparator接口比较方法中的确切含义是什么?,java,sorting,data-structures,collections,comparator,Java,Sorting,Data Structures,Collections,Comparator,我所理解的 如果返回值为0,则无需执行任何操作。如果为-1,则将扫描这两个值。如果要更改顺序(asc/desc),只需更改比较运算符。 我在网站上找到的内容 当第一个参数小于、等于或大于第二个参数时,返回值将为-1、0或1。 我想知道的 为什么我们需要返回值1?我测试了我的程序,没有返回值1,它排序正确 以下程序按年级按升序对学生对象进行排序。如果要更改排序顺序,请更改比较运算符 import java.util.*; public class HelloWorld { public sta

我所理解的
如果返回值为0,则无需执行任何操作。如果为-1,则将扫描这两个值。如果要更改顺序(asc/desc),只需更改比较运算符。
我在网站上找到的内容
当第一个参数小于、等于或大于第二个参数时,返回值将为-1、0或1。
我想知道的
为什么我们需要返回值1?我测试了我的程序,没有返回值1,它排序正确

以下程序按年级按升序对学生对象进行排序。如果要更改排序顺序,请更改比较运算符

import java.util.*;
public class HelloWorld {
  public static void main(String[] args) {
    Student s1 = new Student("JJJ", 5);
    Student s2 = new Student("DDD", 2);
    Student s3 = new Student("RRR", 4);
    Student s4 = new Student("CCC", 4);
    Student s5 = new Student("GGG", 3);
    Student s6 = new Student("JJJ", 1);
    List < Student > ls = new ArrayList < > ();
    ls.add(s1);
    ls.add(s2);
    ls.add(s3);
    ls.add(s4);
    ls.add(s5);
    ls.add(s6);
    for (Student s: ls) {
      s.print();
    }
    System.out.println("=====================");
    ls.sort(new Comparator < Student > () {
      @Override
      public int compare(Student s1, Student s2) {
        if (s1.grade < s2.grade) return -1;
        // else if (s1.grade > s2.grade) return 1;
        else return 0;
      }
    });
    for (Student s: ls) {
      s.print();
    }
  }
  public static void printLs(List < Student > ls) {
    for (Student s: ls) {
      s.print();
    }
  }
}
class Student {
  String name;
  int grade;

  Student(String name, int grade) {
    this.name = name;
    this.grade = grade;
  }

  void print() {
    System.out.println(this.name + " - " + this.grade);
  }
}
import java.util.*;
公共类HelloWorld{
公共静态void main(字符串[]args){
学生s1=新生(“JJJ”,5);
学生s2=新生(“DDD”,2);
学生s3=新生(“RRR”,4);
学生s4=新生(“CCC”,4);
学生s5=新生(“GGG”,3);
学生s6=新生(“JJJ”,1);
列表ls=newarraylist<>();
ls.加入(s1);
ls.加入(s2);
ls.加入(s3);;
ls.加入(s4);
ls.加入(s5);
加入(中六);
学生(s:ls){
s、 打印();
}
System.out.println(“==================================”);
ls.sort(新的比较器(){
@凌驾
公共整数比较(学生s1、学生s2){
如果(s1.等级s2.grade)返回1;
否则返回0;
}
});
学生(s:ls){
s、 打印();
}
}
公共静态无效打印(列表<学生>打印){
学生(s:ls){
s、 打印();
}
}
}
班级学生{
字符串名;
国际等级;
学生(字符串名称,整数等级){
this.name=名称;
这个。等级=等级;
}
作废打印(){
System.out.println(this.name+“-”+this.grade);
}
}
如果为-1,则两个值将[交换]

不一定。这取决于排序代码调用回调时使用的两个元素。可能返回
-1
不会使它交换它们,但返回
1

我测试了我的程序,没有返回值1,它排序正确

您只是幸运地得到了您正在排序的特定数据,排序代码使用的特定算法不需要您的回调才能准确。对于其他数据,它将无法正常工作,因为对于
else,如果注释掉
,当它们不相同时,您将返回
0
(这两个是相同的),因为
s1
将在
s2
之后


不要试图猜测文档告诉了您什么,或者猜测
排序的具体实现是如何工作的。正确实现回调,使其返回负数、零或正数,具体取决于给定的两个元素的排序方式。

我修改了您的代码,以便在开始时生成更多数据,以证明您的数据集太小,无法显示问题

你可以看到并运行它。(我没有关联)


不要依赖抽象排序调用来始终使用相同的排序实现。它可以根据数据集的大小调用不同的策略。

什么意思“这取决于排序代码调用回调的两个元素”?@NyeinChan-您只知道它调用回调的
a
b
。您不知道正在排序的集合中的
a
b
顺序是什么<例如,代码>a
(或
b
)可能正在根据之前的比较进行重新定位。您只知道回调函数被要求告诉排序算法这两个元素的顺序。排序回调的任务是准确地提供该信息。“如果它是-1,那么这两个值将[交换]”不一定。例如,该算法根本不使用交换。不要对使用的算法做任何假设。它可能会在不通知的情况下更改。“返回值将为-1、0或1,因为第一个参数小于、等于或大于第二个。”不一定。
compare
/
compareTo
的一些实现可能会这样做,但一些可能会返回
0
,因为它们是根据规范允许的,例如,它们不限于返回
-1
,但可以返回例如
-42
。确切的值可以是任何值,并且没有任何意义。“为什么我们需要返回值1?”因为需求声明“实现者必须确保所有
x
y
sgn(x.compareTo(y))===-sgn(y.compareTo(x))
”。因此,如果
x.compareTo(y)
返回-1,那么
y.compareTo(x)
必须返回+1。