compareTo 是如何工作的? (可比较的界面)Java 8
How does compareTo work? (Comparable Interface) Java 8
我不明白 compareTo 的概念。根据我的阅读,由于它是一个接口,我们可以决定一个对象与另一个对象的比较方式(我们定义一个对象大于、等于和小于另一个对象的含义)。但是当你使用 compareTo 方法时,它 returns 一个整数。这怎么联系?我们如何处理该整数?这如何连接到排序方法?
示例场景:您正在比较两个字符串。你想对它们进行排序,使字母最多的字符串排在最前面。 问题:如何设置?
http://www.javapractices.com/topic/TopicAction.do?Id=10
link 提供了实施 compareTo 的良好指南。
当您有一个 class 需要订购实例时,compareTo 会派上用场。当您实施 compareTo 时,您基本上是在告诉排序方法 class 的不同实例如何相互比较 。
假设您有一个 class 学生,他拥有一个整数年龄、双倍 GPA 和一个字符串名称,您真的可以按这些字段中的任何一个对学生的实例进行排序。但是,您决定要根据年龄排序。然后,您将根据年龄而不是其他两个字段将 compareTo 函数实现为 return 反馈。
按升序和降序对自定义对象列表进行排序
Java 提供了两个接口来使用 class:
的数据成员对对象进行排序
比较和
比较器接口
Java 比较界面
Java 比较接口用于对用户自定义的对象进行排序class。
此接口位于 java.lang 包中,仅包含一个名为 compareTo(Object) 的方法。
它仅提供单一排序序列,即您可以仅基于单个数据成员对元素进行排序。
public int compareTo(Object obj): 用于比较当前对象和指定对象。
我们可以对以下元素进行排序:
字符串对象
包装 class 个对象
用户定义的 class 个对象
Java 比较器接口
Java Comparator接口用于对用户自定义的对象进行排序class。
Collections class 提供了对集合元素进行排序的静态方法。
用于对 List 元素进行排序的 Collections class 方法
public void sort(List list, Comparator c): 用于通过给定的Comparator对List的元素进行排序。
参考文献:http://corejavapractical.blogspot.in/2017/08/algorithms-in-java.html
package com.mycompany.projectname.corejava;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.concurrent.CopyOnWriteArrayList;
public class AlgorithmsDemo {
public static void main(String[] args) {
//sortingCustomObjectsByComparable();
sortingCustomObjectsByComparator();
}
private static void sortingCustomObjectsByComparable(){
// Sort Projects by project id in ascending order.
List projects = new ArrayList<>();
Project project = new Project();
project.setProjectId(100);
project.setProjectName("project 100");
projects.add(project);
Project project2 = new Project();
project2.setProjectId(200);
project2.setProjectName("project 200");
projects.add(project2);
Project project3 = new Project();
project3.setProjectId(50);
project3.setProjectName("project 50");
projects.add(project3);
Collections.sort(projects);
printList(projects);
}
private static void sortingCustomObjectsByComparator(){
// Sort Projects by project id in ascending order.
List projects = new ArrayList<>();
Project project = new Project();
project.setProjectId(100);
project.setProjectName("project 100");
projects.add(project);
Project project2 = new Project();
project2.setProjectId(200);
project2.setProjectName("project 200");
projects.add(project2);
Project project3 = new Project();
project3.setProjectId(50);
project3.setProjectName("project 50");
projects.add(project3);
// Sorting project by project id in ascending order in Java
Collections.sort(projects);
printList(projects);
// Sorting project by project id in descending order in Java
Collections.sort(projects, Collections.reverseOrder());
printList(projects);
// Sorting project by project name in ascending order in Java
Comparator comparator = new Comparator() {
@Override
public int compare(Project o1, Project o2) {
// TODO Auto-generated method stub
return o1.getProjectName().compareTo(o2.getProjectName());
}
};
Collections.sort(projects, comparator);
printList(projects);
}
private static void printList(List projects){
for(Project project : projects){
System.out.println(project.getProjectId());
System.out.println(project.getProjectName());
}
}
}
class Project implements Comparable{
private int projectId;
private String projectName;
public int getProjectId() {
return projectId;
}
public void setProjectId(int projectId) {
this.projectId = projectId;
}
public String getProjectName() {
return projectName;
}
public void setProjectName(String projectName) {
this.projectName = projectName;
}
@Override
public int compareTo(Project o) {
// TODO Auto-generated method stub
return this.projectId - o.getProjectId();
}
}
让我们直奔主题。想象一下,我们有一个 class K
,我们定义为实现 Comparable<K>
,并且有两个引用 a
和 b
class K
。
要知道 a
是否“小于 </code>b`,我们写 </p>
<pre><code>if (a.compareTo(b) < 0) {
// compareTo returned a negative number
,,,
}
要知道 a
是否是 "equal to" b
,我们写
if (a.compareTo(b) == 0) {
// compareTo returned zero
...
}
并且要知道 a
是否是 "greater than" b
,我们写
if (a.compareTo(b) > 0) {
// compareTo returned a positive integer
...
}
这样是不是有点明白了?
我不明白 compareTo 的概念。根据我的阅读,由于它是一个接口,我们可以决定一个对象与另一个对象的比较方式(我们定义一个对象大于、等于和小于另一个对象的含义)。但是当你使用 compareTo 方法时,它 returns 一个整数。这怎么联系?我们如何处理该整数?这如何连接到排序方法? 示例场景:您正在比较两个字符串。你想对它们进行排序,使字母最多的字符串排在最前面。 问题:如何设置?
http://www.javapractices.com/topic/TopicAction.do?Id=10 link 提供了实施 compareTo 的良好指南。
当您有一个 class 需要订购实例时,compareTo 会派上用场。当您实施 compareTo 时,您基本上是在告诉排序方法 class 的不同实例如何相互比较 。
假设您有一个 class 学生,他拥有一个整数年龄、双倍 GPA 和一个字符串名称,您真的可以按这些字段中的任何一个对学生的实例进行排序。但是,您决定要根据年龄排序。然后,您将根据年龄而不是其他两个字段将 compareTo 函数实现为 return 反馈。
按升序和降序对自定义对象列表进行排序
Java 提供了两个接口来使用 class:
的数据成员对对象进行排序比较和 比较器接口
Java 比较界面
Java 比较接口用于对用户自定义的对象进行排序class。 此接口位于 java.lang 包中,仅包含一个名为 compareTo(Object) 的方法。 它仅提供单一排序序列,即您可以仅基于单个数据成员对元素进行排序。 public int compareTo(Object obj): 用于比较当前对象和指定对象。 我们可以对以下元素进行排序: 字符串对象 包装 class 个对象 用户定义的 class 个对象
Java 比较器接口
Java Comparator接口用于对用户自定义的对象进行排序class。 Collections class 提供了对集合元素进行排序的静态方法。 用于对 List 元素进行排序的 Collections class 方法 public void sort(List list, Comparator c): 用于通过给定的Comparator对List的元素进行排序。
参考文献:http://corejavapractical.blogspot.in/2017/08/algorithms-in-java.html
package com.mycompany.projectname.corejava;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.concurrent.CopyOnWriteArrayList;
public class AlgorithmsDemo {
public static void main(String[] args) {
//sortingCustomObjectsByComparable();
sortingCustomObjectsByComparator();
}
private static void sortingCustomObjectsByComparable(){
// Sort Projects by project id in ascending order.
List projects = new ArrayList<>();
Project project = new Project();
project.setProjectId(100);
project.setProjectName("project 100");
projects.add(project);
Project project2 = new Project();
project2.setProjectId(200);
project2.setProjectName("project 200");
projects.add(project2);
Project project3 = new Project();
project3.setProjectId(50);
project3.setProjectName("project 50");
projects.add(project3);
Collections.sort(projects);
printList(projects);
}
private static void sortingCustomObjectsByComparator(){
// Sort Projects by project id in ascending order.
List projects = new ArrayList<>();
Project project = new Project();
project.setProjectId(100);
project.setProjectName("project 100");
projects.add(project);
Project project2 = new Project();
project2.setProjectId(200);
project2.setProjectName("project 200");
projects.add(project2);
Project project3 = new Project();
project3.setProjectId(50);
project3.setProjectName("project 50");
projects.add(project3);
// Sorting project by project id in ascending order in Java
Collections.sort(projects);
printList(projects);
// Sorting project by project id in descending order in Java
Collections.sort(projects, Collections.reverseOrder());
printList(projects);
// Sorting project by project name in ascending order in Java
Comparator comparator = new Comparator() {
@Override
public int compare(Project o1, Project o2) {
// TODO Auto-generated method stub
return o1.getProjectName().compareTo(o2.getProjectName());
}
};
Collections.sort(projects, comparator);
printList(projects);
}
private static void printList(List projects){
for(Project project : projects){
System.out.println(project.getProjectId());
System.out.println(project.getProjectName());
}
}
}
class Project implements Comparable{
private int projectId;
private String projectName;
public int getProjectId() {
return projectId;
}
public void setProjectId(int projectId) {
this.projectId = projectId;
}
public String getProjectName() {
return projectName;
}
public void setProjectName(String projectName) {
this.projectName = projectName;
}
@Override
public int compareTo(Project o) {
// TODO Auto-generated method stub
return this.projectId - o.getProjectId();
}
}
让我们直奔主题。想象一下,我们有一个 class K
,我们定义为实现 Comparable<K>
,并且有两个引用 a
和 b
class K
。
要知道 a
是否“小于 </code>b`,我们写 </p>
<pre><code>if (a.compareTo(b) < 0) {
// compareTo returned a negative number
,,,
}
要知道 a
是否是 "equal to" b
,我们写
if (a.compareTo(b) == 0) {
// compareTo returned zero
...
}
并且要知道 a
是否是 "greater than" b
,我们写
if (a.compareTo(b) > 0) {
// compareTo returned a positive integer
...
}
这样是不是有点明白了?